GDB跳过共享库断点

时间:2019-07-10 01:51:56

标签: c debugging gdb

我使用带有简单C程序的调试器,试图通过共享库设置断点,但是GDB完全跳过了该断点。

我正在尝试通过简单的C程序使用GDB来了解GDB。我设置了3个断点,第7行设置了1个断点,在strcpy函数上设置了一个断点,第8行中设置了一个断点。然后按“ 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   

1 个答案:

答案 0 :(得分: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上设置断点。