我使用带有简单C程序的调试器,试图通过共享库设置断点,但是GDB完全跳过了该断点。
我正在尝试通过简单的C程序使用GDB来了解GDB。我设置了3个断点,第7行设置了1个断点,在strcpy函数上设置了一个断点,第8行中设置了一个断点。然后按“ 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
答案 0 :(得分:1)
您未指定平台。我怀疑这是带有GLIBC的Linux。
GDB如此操作的原因是strcpy
不是普通函数,而是GNU IFUNC
。
尝试在__strcpy_sse2_unaligned
上设置断点,然后查看this答案。
更新:
调试器在到达断点2
时会吐出该错误"../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.
__strcpy_sse2_unaligned
视为strcpy
的别名。在系统上设置断点等同于在strcpy
上设置断点。