加断点时GDB反汇编地址不同
GDB disassembly address different when adding breakpoint
这是我的带有行号的函数
8 | void function(char* string) {
9 | char buffer[16];
10| strcpy(buffer,string);
11| }
这是 gdb disassemble function
输出
0x000011d4 <+0>: push %ebp
0x000011d5 <+1>: mov %esp,%ebp
0x000011d7 <+3>: push %ebx
0x000011d8 <+4>: sub [=11=]x14,%esp
0x000011db <+7>: call 0x123d <__x86.get_pc_thunk.ax>
0x000011e0 <+12>: add [=11=]x2e20,%eax
0x000011e5 <+17>: sub [=11=]x8,%esp <---- I want Break point here
0x000011e8 <+20>: pushl 0x8(%ebp)
0x000011eb <+23>: lea -0x18(%ebp),%edx
0x000011ee <+26>: push %edx
0x000011ef <+27>: mov %eax,%ebx
0x000011f1 <+29>: call 0x1030 <strcpy@plt>
0x000011f6 <+34>: add [=11=]x10,%esp
0x000011f9 <+37>: nop
0x000011fa <+38>: mov -0x4(%ebp),%ebx
0x000011fd <+41>: leave
0x000011fe <+42>: ret
如果我使用以下命令在 0x000011e5
设置断点,
(gdb) b *0x000011e5
和运行程序,gdb忽略所有断点并退出。
但是,如果我指定,
b 9
,有效。
这是输出
(gdb) b 10
Breakpoint 1 at 0x4011e5: file hello.c, line 10.
为什么地址不同?
Why are the address different
因为你有一个与位置无关的可执行文件,它链接在地址 0,但在运行时重新定位到不同的地址。
这是我的带有行号的函数
8 | void function(char* string) {
9 | char buffer[16];
10| strcpy(buffer,string);
11| }
这是 gdb disassemble function
输出
0x000011d4 <+0>: push %ebp
0x000011d5 <+1>: mov %esp,%ebp
0x000011d7 <+3>: push %ebx
0x000011d8 <+4>: sub [=11=]x14,%esp
0x000011db <+7>: call 0x123d <__x86.get_pc_thunk.ax>
0x000011e0 <+12>: add [=11=]x2e20,%eax
0x000011e5 <+17>: sub [=11=]x8,%esp <---- I want Break point here
0x000011e8 <+20>: pushl 0x8(%ebp)
0x000011eb <+23>: lea -0x18(%ebp),%edx
0x000011ee <+26>: push %edx
0x000011ef <+27>: mov %eax,%ebx
0x000011f1 <+29>: call 0x1030 <strcpy@plt>
0x000011f6 <+34>: add [=11=]x10,%esp
0x000011f9 <+37>: nop
0x000011fa <+38>: mov -0x4(%ebp),%ebx
0x000011fd <+41>: leave
0x000011fe <+42>: ret
如果我使用以下命令在 0x000011e5
设置断点,
(gdb) b *0x000011e5
和运行程序,gdb忽略所有断点并退出。
但是,如果我指定,
b 9
,有效。
这是输出
(gdb) b 10
Breakpoint 1 at 0x4011e5: file hello.c, line 10.
为什么地址不同?
Why are the address different
因为你有一个与位置无关的可执行文件,它链接在地址 0,但在运行时重新定位到不同的地址。