簡體   English   中英

GDB跳過共享庫斷點

[英]GDB skips shared library breakpoint

我使用帶有簡單C程序的調試器,試圖通過共享庫設置斷點,但是GDB完全跳過了該斷點。

我試圖通過簡單的C程序使用GDB來了解GDB。 我設置了3個斷點,第7行設置了1個斷點,在strcpy函數上設置了1個斷點,在第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   

您未指定平台。 我懷疑這是帶有GLIBC的Linux。

GDB以這種方式運行的原因是strcpy不是普通函數,而是GNU IFUNC

嘗試在__strcpy_sse2_unaligned上設置斷點,然后查看答案。

更新:

只要調試器到達斷點2,調試器就會吐出該錯誤, "../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.

  1. 那不是錯誤。
  2. 它達到該斷點的事實證實了此答案是正確的。
  3. 您可以簡單地將__strcpy_sse2_unaligned視為strcpy的別名。 在系統上設置斷點等同於在strcpy上設置斷點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM