c - 如何从 C 静态库中分离调试符号,然后将其加载到 GDB 中

标签 c debugging gdb static-libraries

我有一个静态库,它是用带有“-g”标志编译的目标文件构建的。我将这个静态库的调试信息分离到一个单独的文件中,例如: objcopy --only-keep-debug lib_mylib.o lib_mylib.o.debug

然后将我的应用程序与此静态库链接(从中删除调试信息后)作为 gcc -g driver.c -o driver -L。 -l_mylib

有人可以指导我如何将静态库中的调试信息从 lib_mylib.o.debug 加载到 GDB 中,以便我可以在我的应用程序中调试由静态库提供的代码吗? 尝试通过添加符号文件命令加载 GDB 时出现以下错误:

(gdb) add-symbol-file lib_mylib.a.debug 0x0
add symbol table from file "lib_mylib.a.debug" at
    .text_addr = 0x0
(y or n) y
`/home/sbunny/tmp/static-lib/lib_mylib.a.debug': can't read symbols: File format not recognized.

最佳答案

不要这样做:

objcopy --only-keep-debug lib_mylib.o lib_mylib.o.debug

(它只适用于共享库。)

改为这样做:

cp lib_mylib.o lib_mylib.o.debug

更简单的方法可能是保持 lib_mylib.o 不变,并在链接时从可执行文件中去除调试符号:

gcc -g driver.c -o driver -L. -l_mylib -Wl,-s

更简单的是:将二进制文件与调试信息链接起来并保留它用于调试,但在需要剥离的地方使用剥离的可执行文件:

gcc -g driver.c -o driver-dbg -L. -l_mylib &&
strip -g -o driver driver-dbg

有了上面,你不需要add-symbol-file,只需将GDB指向driver-dbg,它会自动完成所有事情。

关于c - 如何从 C 静态库中分离调试符号,然后将其加载到 GDB 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61501705/

相关文章:

C 方法给出警告 : expression result unused and freezes

c - 无法确定此汇编代码中的常量

c - 以下每个项目都有一个错误(我需要修复它们)

c++ - 如何在函数返回的 GDB 中设置断点?

c++ - libc 退出调用中的核心转储

计算 C 预处理器中两个代码位置之间的行数

c - 查看是否通过 tcp 传递了消息

c - 打印 uint8_t

c++ - 为什么 Valgrind 不检测未初始化变量的使用?

c - GDB:如何在知道行号的情况下获取函数声明的地址?