![](/img/trans.png)
[英]How to load shared libraries symbols for remote source level debugging with gdb and gdbserver?
[英]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 中,以便我可以有意義地調試它?
如果共享庫被剝離,並且調試符號作為單獨的文件提供,則需要在鏈接器加載共享庫后加載它們。 符號應加載到加載共享庫的內存地址上。
以下是加載符號的示例:
啟動 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.
創建斷點(在main
或任何其他地方)並開始調試
(gdb) b 35 Breakpoint 1 at 0xd7c: file test.c, line 35. (gdb) r Starting program: /root/testing/lib-test/a.out
找到加載要調試的共享庫的內存位置(在本例中,庫是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
開始加載
使用共享庫中的地址加載符號文件
(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.