Gcc 使用调试符号重新编译exe,用于不使用调试符号的exe生成的核心转储

Gcc 使用调试符号重新编译exe,用于不使用调试符号的exe生成的核心转储,gcc,gdb,Gcc,Gdb,我有一个缺少调试信息的内核转储。转储是由一个不太容易复制的错误引起的 由于我确切地知道源代码的哪个版本以及原始构建命令和优化级别,是否可以为该可执行文件生成调试信息?是,这是可能的。这是一个相当冗长的例子 产生崩溃的程序(crash.c): 使用调试符号编译版本: $ gcc crash.c -o crash $ gcc -g crash.c -o crash_debug 使用不带调试符号的二进制文件生成核心文件: $ ./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAA

我有一个缺少调试信息的内核转储。转储是由一个不太容易复制的错误引起的


由于我确切地知道源代码的哪个版本以及原始构建命令和优化级别,是否可以为该可执行文件生成调试信息?

是,这是可能的。这是一个相当冗长的例子

产生崩溃的程序(
crash.c
):

使用调试符号编译版本:

$ gcc crash.c -o crash
$ gcc -g crash.c -o crash_debug
使用不带调试符号的二进制文件生成核心文件:

$ ./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Segmentation fault (core dumped)
使用
gdb
和不带调试符号的二进制查看内核:

$ gdb -q ./crash  core                                                                         

warning: ~/.gdbinit.local: No such file or directory
Reading symbols from ./crash...(no debugging symbols found)...done.

warning: exec file is newer than core file.
[New LWP 7768]
Core was generated by `./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x000000000040052b in func ()
正如我们所看到的,
gdb
找不到任何调试符号。 现在,让我们尝试使用构建为包含调试符号的二进制文件和
core
文件启动
gdb

$ gdb -q ./crash_debug  core                                                                   

warning: ~/.gdbinit.local: No such file or directory
Reading symbols from ./crash_debug...done.

warning: core file may not match specified executable file.
[New LWP 7768]
Core was generated by `./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x000000000040052b in func (str=0x7fff4bb66f73 'A' <repeats 52 times>) at crash.c:8
8   }

希望这有帮助

猜测:只要使用相同的编译器、相同的开关+-g、相同的库构建,它就可能工作。然后用符号文件从这个新的二进制文件加载符号(在已加载可执行文件之后)。谢谢,但不幸的是,它不起作用。我怀疑我的环境与以前略有不同。核心转储为我提供了更多的帧,其中??而不是符号名称。嘿,那太糟糕了:(您尝试了哪个版本?您是使用新二进制文件和编码器启动了
gdb
,例如
gdb/path/to/new/bin/path/to/core
,还是使用core运行了
gdb
,然后使用
symbol file/path/to/new/binary
从新二进制文件中加载符号?此外,您是否确保新二进制文件确实是构建的ld与调试信息?我尝试了两者,当我使用没有
符号文件的重新编译二进制文件时,我得到了
。对不起,我没有时间深入研究这个问题。
$ gdb -q ./crash_debug  core                                                                   

warning: ~/.gdbinit.local: No such file or directory
Reading symbols from ./crash_debug...done.

warning: core file may not match specified executable file.
[New LWP 7768]
Core was generated by `./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x000000000040052b in func (str=0x7fff4bb66f73 'A' <repeats 52 times>) at crash.c:8
8   }
$ gdb -q -c core                                                                               

warning: ~/.gdbinit.local: No such file or directory
[New LWP 7768]
Core was generated by `./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x000000000040052b in ?? ()
gdb$ symbol-file crash_debug 
Reading symbols from crash_debug...done.
gdb$ bt
#0  0x000000000040052b in func (str=0x7fff4bb66f73 'A' <repeats 52 times>) at crash.c:8
#1  0x4141414141414141 in ?? ()
#2  0x00007f0041414141 in ?? ()
#3  0x0000000200000000 in ?? ()
#4  0x0000000000000000 in ?? ()
gdb$