GDB 跳过共享库断点
Posted
技术标签:
【中文标题】GDB 跳过共享库断点【英文标题】:GDB skips shared library breakpoint 【发布时间】: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
编译的版本上设置断点?
是的,仍然跳过断点。
【参考方案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
上设置断点。
【讨论】:
我使用的操作系统叫做“Parrot OS”,是基于debian的,希望对你有帮助。此外,每当到达断点 2 时,调试器就会吐出此错误,“../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.” 快到断点了,你只是没有安装 libc 的调试符号。 Fedora 的 gdb 会告诉你安装它们应该使用的确切命令,但在 Debian 上的 IIRC 应该是apt-get install libc6-dbg
我安装了这个,但它仍然吐出相同的错误消息。
运行程序时不显示消息“Pending breakpoint "strcpy" resolved”。这可能是一个重要的细节。
@highboi 我已经更新了答案。你现在得到了你想要的断点,并且应该明白发生了什么。以上是关于GDB 跳过共享库断点的主要内容,如果未能解决你的问题,请参考以下文章