上下文:我的程序运行在服务器上,没有调试选项编译(很难改变配置)。
我得到了不包含符号的corefile,并且我有源代码(不幸的是错误不能在本地复制)。
我知道strip
(https://man7.org/linux/man-pages/man1/strip.1.html)可以从ELF中删除符号。有什么工具可以把它们加回去吗?
是否有工具可以将它们添加回来?
不,但是你可以给GDB一个带有调试符号的二进制,而不是实际产生core
的二进制。
最佳实践是总是用调试符号构建,例如gcc -g -O2 foo.c -o foo-g
,保持这个foo-g for future debugging, but ship to production a stripped binary:
条带-g -o foo foo-g '。
当您从生产中获得core
时,只需使用gdb foo-g core
,您将更容易调试。
但是让我们假设您没有遵循最佳实践,并使用gcc -O2 foo.c -o foo
构建二进制文件。你能做些什么来恢复调试信息吗?
使用gcc
(和g++
),您应该能够。只需从完全相同的源重新构建应用程序,使用完全相同的命令行标志,但附加-g
。使用新构建的二进制文件调试core
。
如果您使用clang
,这个过程可能无法工作,因为clang
在使用和不使用-g
时不会产生相同的代码。