簡體   English   中英

共享庫中的gdb斷點不起作用

[英]gdb breakpoint in shared library not working

因此,我有以下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”,並得到“斷點2(strcpy)”待處理。

在回答“是”並運行程序之后,絕不會解決斷點2的問題,調試器會在printf處直接跳至斷點3。

我在調試器中使用Intel語法。 除此之外,沒有自定義設置。 誰能說說為什么strcpy的斷點從未解決過?

諸如gcc之類的編譯器對諸如strcpy之類的字符串函數的語義非常熟悉。 在您的示例的x86-64上,即使在-O0處,gcc 9也會生成內聯匯編而不是strcpy調用。 斷點應適用於大多數其他功能。

用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    

暫無
暫無

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

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