【问题标题】:GDB skips shared library breakpointGDB 跳过共享库断点
【发布时间】: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 编译的版本上设置断点?
  • 是的,仍然跳过断点。

标签: c debugging gdb


【解决方案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. 时会吐出这个错误

  1. 这不是错误。
  2. 它到达断点的事实证实了这个答案是正确的。
  3. 您可以简单地将__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 我已经更新了答案。你现在得到了你想要的断点,并且应该明白发生了什么。
猜你喜欢
  • 1970-01-01
  • 2016-11-26
  • 2017-02-11
  • 2018-10-29
  • 1970-01-01
  • 2012-11-19
  • 2014-03-29
  • 1970-01-01
  • 2012-08-10
相关资源
最近更新 更多