需要在GDB中加载共享库的调试符号符号、加载、GDB

由网友(非主流男生超拽网名1)分享简介:我正在使用gdb调试一个使用libp线程的程序。有一个错误发生在pthREAD_CREATE中,需要进入该函数。不幸的是,当我调试我的程序时,它不能正确地加载共享库符号,所以我不能跳过源代码并有意义地检查程序行为。这是我启动gdb时的输出。Remote debugging using 127.0.0.1:21293...

我正在使用gdb调试一个使用libp线程的程序。有一个错误 发生在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"的截断输出(在p线程_CREATE中,我要在调试器中检查的函数)

#0  0x68200ce2 in ?? ()
#1  0x68403cbf in ?? ()
#2  0x687571b0 in ?? ()
#3  0x6874c638 in ?? ()
#4  0x68867a72 in ?? ()
....
加密与解密 调试篇 动态调试技术 三 OllyDbg 插件 Run Hit 符号调试 加载程序

进程‘/proc/.../map显示了libp线程映射到内存的位置。

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...

之后,您可以跟踪库中的执行流、列出源代码行、按名称检查变量等。

阅读全文

相关推荐

最新文章