gpt4 book ai didi

c - 需要为 GDB 中的共享库加载调试符号

转载 作者:行者123 更新时间:2023-12-04 13:05:06 32 4
gpt4 key购买 nike

我正在使用 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...

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

    关于c - 需要为 GDB 中的共享库加载调试符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30281766/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com