8

gdb を使用して基本的な C プログラムを実行しています。の先頭にブレークポイントがありmain()ます。コードを実行した後、gdb は予想どおり main() で中断します。スタック ポインター レジスター (rsp) を調べると、

0x7fffffffe170: 0x00000000. 

cat /proc/17232/stat | cut -d" " -f29/proc(17232 はこのプロセスの pid です) を使用して同じ情報を取得すると、次のように表示されます。

140737488347112 (which in hex is: 0x7fffffffdfe8). 

現在のスタック ポインターの値が gdb と異なるのはなぜですか。また、gdb が rsp の内容を NULL (0x00000000) として表示するのはなぜですか?

ありがとう。

4

1 に答える 1

2

rspレジスタ (64b CPU 上) からの出力/proc

(gdb) info register rsp
rsp            0x7fffffffe480   0x7fffffffe480 

からのものと比較して実際に異なる値を与えます/proc

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

gdbは、実行を引き継ぐためにmain関数の開始時にプログラムを強制的に中断する必要があり、最小限のデータ セット (戻りアドレス、一部のレジスタ バックアップ) がスタックに保存されるためです。次に、 gdbは独自のスタックを使用してプログラム スタックをオーバーフローさせず、レジスタの表示やスタック データの操作を要求したときに必要な調整操作を行います。内部gdbのクッキングは表示されません。ただし、変更されていない実際のデータを示しています。/proc

「実際の」rsp fromは、実際にはgdb/procのものよりわずかに小さくなります。これは、x86 cpu ではスタックが下向きに成長するためです。

null値に関しては、私のテストでは発生しませんでした

(gdb) x 0x7fffffffe480
0x7fffffffe480: 0xffffe578
于 2013-02-20T13:26:15.830 に答える