【问题标题】:gdb breakpoint in shared library not working共享库中的 gdb 断点不起作用
【发布时间】:2017-02-11 20:32:03
【问题描述】:

所以,我有以下 c 程序:

#include <stdio.h>
#include <string.h>

int main(){
        char arr[20];
        //this is line 6
        strcpy(arr,"Hello, world!\n");
        printf(arr);
}

我使用以下命令编译它:

gcc -g t2.c -o a2.out

之后我将它加载到 gdb 并尝试在第 6 行、strcpy 函数和第 8 行设置断点。果然,在 strcpy 设置断点时,我收到以下消息:“在未来共享库上设置断点挂起负载?(y 或 [n])”。我回答“y”并得到“Breakpoint 2 (strcpy) pending。”。

在回答“是”并运行程序后,断点 2 永远不会解决,调试器直接跳转到 printf 处的断点 3。

我在调试器中使用 Intel 语法。除此之外没有自定义设置。谁能说出为什么 strcpy 处的断点永远无法解决?

【问题讨论】:

  • 最好的方法是在main 中断,然后在strcpy 中断以确保加载C 库(将避免我永远无法工作的挂起断点功能)。跨度>
  • 我尝试在main 中插入一个中断,运行代码,并在到达第一个中断后在strcpy 再次中断。它返回了这条消息Breakpoint 2 at gnu-indirect-function resolver at 0xb7e79f00。继续后,从未到达第二个断点。
  • 如果你用-fno-builtin-strcpy选项编译程序,它会在你的断点处停止吗?
  • 虽然设置了断点,但是到达断点时返回这个错误:Breakpoint 2, __strcpy_sse2 () at ../sysdeps/i386/i686/multiarch/strcpy-sse2.S:1613 1613 ../sysdeps/i386/i686/multiarch/strcpy-sse2.S: No such file or directory.
  • 该错误仅表示您没有安装 glibc 的源代码。在这种情况下,它实际上已正确停止。 strcpy 很特别,因为它是一个微优化的“间接”函数,这意味着在第一次调用时会选择特定的特定于架构的实现(或者可能是 ld.so,我忘了)。我认为 gdb 在很好地调试间接函数方面仍然存在一些问题。

标签: c debugging gdb shared-libraries breakpoints


【解决方案1】:

gcc 等编译器非常熟悉strcpy 等字符串函数的语义。 在 x86-64 上,gcc 9 正在生成内联程序集,而不是 strcpy 调用,即使在 -O0。断点应该适用于大多数其他功能。

使用 gcc-9 生成的 x86-64 反汇编(无 strcpy 调用):

    0000000000000000 <main>:
       0:   48 83 ec 28             sub    rsp,0x28
       4:   48 b8 48 65 6c 6c 6f 2c 20 77   movabs rax,0x77202c6f6c6c6548
       e:   bf 01 00 00 00          mov    edi,0x1
      13:   48 89 04 24             mov    QWORD PTR [rsp],rax
      17:   b8 21 0a 00 00          mov    eax,0xa21
      1c:   48 89 e6                mov    rsi,rsp
      1f:   66 89 44 24 0c          mov    WORD PTR [rsp+0xc],ax
      24:   31 c0                   xor    eax,eax
      26:   c7 44 24 08 6f 72 6c 64     mov    DWORD PTR [rsp+0x8],0x646c726f
      2e:   c6 44 24 0e 00          mov    BYTE PTR [rsp+0xe],0x0
      33:   e8 00 00 00 00          call   38 <main+0x38>   34: R_X86_64_PLT32  __printf_chk-0x4
      38:   31 c0                   xor    eax,eax
      3a:   48 83 c4 28             add    rsp,0x28
      3e:   c3                      ret    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2012-02-19
    • 1970-01-01
    • 2012-11-19
    • 2014-03-29
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多