相关疑难解决方法(0)

如何使用libc的调试版

问题的简短版本: 如何让gdb使用libc的调试符号?

更长版本: 我正在使用gdb调试程序,我想查看有关libc使用的futex的信息.但是,在调试期间的某个时刻,我得到的输出如下:

Catchpoint 2 (call to syscall futex), 0x00007ffff772b73e in ?? () from /lib/libc.so.6
(gdb) bt
#0  0x00007ffff772b73e in ?? () from /lib/libc.so.6
#1  0x00007ffff767fb90 in ?? () from /lib/libc.so.6
#2  0x00007ffff767a4c0 in vfprintf () from /lib/libc.so.6
#3  0x00007ffff768565a in printf () from /lib/libc.so.6
....
Run Code Online (Sandbox Code Playgroud)

当我info sharedlibrary在断点处运行gdb时,我看到:

(gdb) info sharedlibrary
From                To                  Syms Read   Shared Object Library
0x00007ffff7dddaf0  0x00007ffff7df6704  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7bc53e0  0x00007ffff7bd1388  Yes (*)     /lib/libpthread.so.0
0x00007ffff79ba190  0x00007ffff79bd7d8  Yes (*)     /lib/librt.so.1
0x00007ffff76538c0  0x00007ffff7766c60  Yes (*) …
Run Code Online (Sandbox Code Playgroud)

linux gdb libc ldd

55
推荐指数
2
解决办法
4万
查看次数

如何在GCC中链接libc和libstdc ++的调试版本?

我知道这个问题,但它似乎对我不起作用.

对于设置,采用一个简单的C++程序,hw.cpp由下式给出:int main() { }

g++ -o hw hw.cpp -O0 -gLinux上编译时,运行ldd ./hw给出:

    linux-gate.so.1 =>  (0x003e5000)
    libstdc++.so.6 => /usr/local/lib/libstdc++.so.6 (0x007c5000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x006a4000)
    libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x00a40000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a93000)
    /lib/ld-linux.so.2 (0x00a0f000)
Run Code Online (Sandbox Code Playgroud)

现在我似乎也有调试库/usr/lib/debug/lib/tls/i686/cmov/,我想这是系统库的相应调试版本.

问:我如何编译我的程序,使其对调试连接建立标准的C和/或C++库,libc/ libm/ libstdc++,共享或静态的?对于共享构建,我希望输出ldd ./hw指向调试目录.

(背景:我的项目使用的一个共享库被Valgrind报告为泄漏("仍然可以访问"),但起源不在共享库本身,而是在dlopen类型代码中(参见此处).所以我我想如果我可以逐步完成_Start()CRT中的调用,我可以追查罪魁祸首.)

更新/更正:我认为我只是非常非常愚蠢 - 调试库可能始终按需要链接.我对调试器在步进时没有显示任何内容感到困惑,这是因为我没有库的源代码.

更新II:好的,保留以前的更新.我现在有了库源代码,但是虽然标准库带有调试符号,但我似乎没有单独的调试版本.这样的构建是否可用,我将如何链接它?

c c++ debugging gcc

16
推荐指数
1
解决办法
4816
查看次数

标签 统计

c ×1

c++ ×1

debugging ×1

gcc ×1

gdb ×1

ldd ×1

libc ×1

linux ×1