4
#include <stdio.h>

int main(void){
   int sum = 0;
   sum += 0xabcd;
   printf(“%x”, sum);
   return 0;
}

これは私のコードであり、gdbを使用すると、break main / break*mainのときに別のアドレスを見つけることができます。

disassemble mainと入力すると、次のように表示されます。

Dump of assembler code for function main:

0x080483c4 <+0>: push %ebp
0x080483c5 <+1>: mov %esp,%ebp
0x080483c7 <+3>: and $0xfffffff0,%esp
0x080483ca <+6>: sub $0x20,%esp
0x080483cd <+9>: movl $0x0,0x1c(%esp)
0x080483d5 <+17>:addl $0xabcd,0x1c(%esp)
0x080483dd <+25>:mov $0x80484c0,%eax
0x080483e2 <+30>:mov 0x1c(%esp),%edx
0x080483e6 <+34>:mov %edx,0x4(%esp)
0x080483ea <+38>:mov %eax,(%esp)
0x080483ed <+41>:call 0x80482f4 <printf@plt>
0x080483f2 <+46>:mov $0x0,%eax
0x080483f7 <+51>:leave
0x080483f8 <+52>:ret

End of assembler dump.

したがって、[break * main]と入力すると、0x080483c4が開始されますが、[break main]と入力すると、0x080483cdが開始されます。

開始アドレスが異なるのはなぜですか?

4

2 に答える 2

5

アドレスが違うのはなぜですか。

break functionとは同じものではないbreak *addressためです(スタックフレームと引数が設定される前の、関数の最初の命令のアドレスを指定します)。*address

最初のケースでは、GDBは関数プロローグ(現在のフレームの設定)をスキップします。

于 2012-09-26T06:56:39.333 に答える
0

完全な推測-そして完全に間違っている準備をしました。

*関数のアドレスがメインの場合

main内でのブレークは、実行中に関数内で停止する最初の使用可能なアドレスです。

0x080483cdは、デバッガーが変数を変更している(つまり、合計にゼロを割り当てる)ときに停止できる最初の場所であることに注意してください。

0x080483c4でブレークしている場合、これはCが何も知らないセットアップアセンブラの前です。

于 2012-09-26T02:23:18.390 に答える