簡體   English   中英

需要為 GDB 中的共享庫加載調試符號

[英]Need to load debugging symbols for shared library in GDB

我正在使用 GDB 調試使用 libpthread 的程序。 pthread_create 中發生錯誤,需要進入該函數。 不幸的是,當我調試我的程序時,它沒有正確加載共享庫符號,所以我無法跳過源代碼並有意義地檢查程序行為..這是我啟動 gdb 后的輸出。

Remote debugging using 127.0.0.1:21293
warning: limiting remote suggested packet size (206696 bytes) to 16384
Failed to read a valid object file image from memory.

所以我相信最后一條消息與讀取調試符號失敗有關。 盡管安裝了 libc6-dbg 包,情況仍然如此。 這是在遇到 SIGSEGV 之前的某個點處“where”的截斷輸出(在 pthread_create 中,我想在調試器中檢查的函數)

#0  0x68200ce2 in ?? ()
#1  0x68403cbf in ?? ()
#2  0x687571b0 in ?? ()
#3  0x6874c638 in ?? ()
#4  0x68867a72 in ?? ()
....

進程的 /proc/.../maps 顯示了 libpthread 映射到內存的位置。

683f8000-68410000 r-xp 00000000 08:01 3017052                            /lib/i386-linux-gnu/i686/cmov/libpthread-2.19.so
68410000-68411000 r--p 00017000 08:01 3017052                            /lib/i386-linux-gnu/i686/cmov/libpthread-2.19.so
68411000-68412000 rw-p 00018000 08:01 3017052                            /lib/i386-linux-gnu/i686/cmov/libpthread-2.19.so

我相信,如果我只能手動將調試符號加載到 gdb 中,那么我將能夠跳過源代碼並找到我的內存錯誤的根源。 但是我不確定如何做到這一點。

我正在 x86_64 Debian 上調試 32 位程序。 我應該怎么做才能將 libpthread 符號加載到 GDB 中,以便我可以有意義地調試它?

為共享庫加載調試符號

如果共享庫被剝離,並且調試符號作為單獨的文件提供,則需要在鏈接器加載共享庫后加載它們。 符號應加載到加載共享庫的內存地址上。

以下是加載符號的示例:

  1. 啟動 gdb

     ~$ gdb a.out GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2 Copyright (C) 2020 Free Software Foundation, Inc. (gdb) info sharedlibrary No shared libraries loaded at this time.
  2. 創建斷點(在main或任何其他地方)並開始調試

    (gdb) b 35 Breakpoint 1 at 0xd7c: file test.c, line 35. (gdb) r Starting program: /root/testing/lib-test/a.out
  3. 找到加載要調試的共享庫的內存位置(在本例中,庫是libtest.so.1

     (gdb) info sharedlibrary From To Syms Read Shared Object Library 0x0000fffff7fcd0c0 0x0000fffff7fe5468 Yes (*) /lib/ld-linux-aarch64.so.1 0x0000fffff7f9f890 0x0000fffff7fb65c0 Yes (*) /usr/local/lib/libtest.so.1 0x0000fffff7e4bbc0 0x0000fffff7f3b190 Yes /lib/aarch64-linux-gnu/libc.so.6 0x0000fffff7dfea50 0x0000fffff7e0ddec Yes /lib/aarch64-linux-gnu/libpthread.so.0

    因此,庫從內存地址0x0000fffff7f9f890開始加載

  4. 使用共享庫中的地址加載符號文件

    (gdb) add-symbol-file ./libsrc/libtest.dbg 0x0000fffff7f9f890 add symbol table from file "./libsrc/libtest.dbg" at .text_addr = 0xfffff7f9f890 (y or n) y Reading symbols from ./libsrc/libtest.dbg...

在此之后,您可以跟蹤庫內的執行流程、列出源代碼行、按名稱檢查變量等。

暫無
暫無

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

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