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 跳过共享库断点的主要内容,如果未能解决你的问题,请参考以下文章

GDB - 未来共享库加载时的断点

如何使用 GDB 调试共享对象库中的函数?

如何在 Linux 的 QTCreator 中使用 dlopen 打开的共享库中设置断点

gdb - 多线程和共享库

关闭在 GDB 中设置断点的确认 [重复]

iOS 5.1 - GDB 命令或实用程序列出特定共享库中的函数