【发布时间】:2019-07-10 01:51:56
【问题描述】:
我正在使用带有简单 C 程序的调试器,我试图用共享库设置断点,但 GDB 完全跳过了这个断点。
我正在尝试将 GDB 与一个简单的 C 程序一起使用来了解 GDB。我设置了 3 个断点,1 个在第 7 行,一个在 strcpy 函数,一个在第 8 行。我尝试在涉及共享库的程序中设置一个断点(特别是“break strcpy”),但每次我运行程序然后按“c”,程序完全跳过断点2
#include <stdio.h>
#include <string.h>
int main() {
char str_a[20];
strcpy(str_a, "Hello, world!\n");
printf(str_a);
}
每当我在调试器中运行程序时,它通常会在断点 1 处停止,这是预期的,但是每当我按“c”继续到断点 2 时,它会完全跳过断点 2,只显示输出断点 3 是应该有。这与 GDB 对共享库的处理有关吗?
编辑:这是反汇编
0x0000555555555145 <+0>: push rbp
0x0000555555555146 <+1>: mov rbp,rsp
0x0000555555555149 <+4>: sub rsp,0x20
0x000055555555514d <+8>: lea rax,[rbp-0x20]
0x0000555555555151 <+12>: lea rsi,[rip+0xeac] # 0x555555556004
0x0000555555555158 <+19>: mov rdi,rax
0x000055555555515b <+22>: call 0x555555555030 <strcpy@plt>
0x0000555555555160 <+27>: lea rax,[rbp-0x20]
0x0000555555555164 <+31>: mov rdi,rax
0x0000555555555167 <+34>: mov eax,0x0
0x000055555555516c <+39>: call 0x555555555040 <printf@plt>
0x0000555555555171 <+44>: mov eax,0x0
0x0000555555555176 <+49>: leave
0x0000555555555177 <+50>: ret
【问题讨论】:
-
试试 -fno-builtins。如果这不起作用,请发布反汇编。
-
我贴出了反汇编代码。希望对您有所帮助。
-
它对我有用,看起来我得到了基本相同的程序集。您是否尝试在使用
-fno-builtin编译的版本上设置断点? -
是的,仍然跳过断点。