共享库中的gdb断点不起作用

时间:2016-10-03 19:52:27

标签: c debugging gdb shared-libraries breakpoints

所以,我有以下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设置断点时,我得到以下消息:&#34;使断点挂起未来的共享库负载? (y或[n])&#34;。我回答说#34; y&#34;并得到了#34; Breakpoint 2(strcpy)等待。&#34;。

在回答是,并运行程序之后,断点2永远不会被解析,调试器会直接跳转到printf上的Breakpoint 3。

我在调试器中使用Intel语法。除此之外没有自定义设置。任何人都可以告诉为什么strcpy的断点永远不会被解决?

1 个答案:

答案 0 :(得分:0)

诸如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