2013-02-20 14 views
8

gdb'yi kullanarak temel bir C programı yürütüyorum. main()'un başında bir kırılma noktası var. Kodu çalıştırdıktan sonra gdb beklendiği gibi main() 'da kırılır. Ben yığın işaretçisi kayıt (rsp) incelemek eğer cat /proc/17232/stat | cut -d" " -f29/proc kullanarak aynı bilgileri almak zaman Şimdi,Geçerli yığın işaretçisini/proc/pid/statünden çıkarılıyor

0x7fffffffe170: 0x00000000. 

görüyorum (17232 bu işlem için pid bırakılmıştır), görüyorum:

140737488347112 (which in hex is: 0x7fffffffdfe8). 

Gdb'den farklı bir yığın yığını işaretçisini nasıl görüyoruz. Ve ayrıca, neden gdb rsp içeriğini (NULL (0x00000000)) gösteriyor?

Teşekkürler.

cevap

2

(gdb) info register rsp 
rsp   0x7fffffffe480 0x7fffffffe480 

/proc den (64b işlemciler üzerinde) RSP kayıt baskı gdb bir zorlama vardır /proc

[email protected]:~$ cat /proc/22219/stat | cut -d" " -f29 | perl -e 'print(sprintf("%x\n",<>));' 
7fffffffe338 

zamandan beri gerçekten birine göre farklı bir değer verir Sırasıyla ana işlevinin başında programda interruption işlevi yürütmeyi devralmak ve minimum bir veri kümesi (dönüş adresi, bazı yazma kayıtları) yığına kaydedilir. gdb daha sonra, programın üzerine taşmamak için kendi kümesini kullanır ve yazmaçları görüntülemeyi veya yığın verisini çalıştırmayı istediğinizde gerekli ayarlama işlemlerini yapar ve iç gdb pişirme işlevini göstermez. Ancak /proc, gerçek verileri değiştirmeden gösterir. x86 yığını aşağıya yetişir CPU'lar üzerinde beri /proc itibaren

"gerçek" rsp, aslında gdb biri biraz daha azdır.

boş değeri gelince, benim testler sırasında açıklama

(gdb) x 0x7fffffffe480 
0x7fffffffe480: 0xffffe578 
+0

Teşekkür olmadı. Testimde hafızanın null olarak niçin gösterildiğini anlamaya çalışacağım. –

İlgili konular