从这这样的帖子中,我知道如何对调试版本应用程序生成的核心转储文件进行分析。对于核心转储文件,我还可以使用gdb工具和bt命令获得调用堆栈。
但当使用其他命令,如信息局部变量,列表,打印局部变量等,我发现他们什么也不显示!令我惊讶的是,这个核心转储文件与调试版本应用程序生成的文件一样大,大小为1.6G字节!
是否有更多的信息,包括调用堆栈?当核心转储生成时,是否可能看到关于上一次函数调用中的变量的其他细节?
发布于 2014-12-19 05:28:18
令我惊讶的是,这个核心转储文件与调试版本应用程序生成的文件一样大,大小为1.6G字节!
你不应该对此感到惊讶。核心转储包含应用程序内存的可修改段。使用debug info编译的应用程序将具有与不带调试信息的应用程序编译的应用程序完全相同的可修改内存,并且应该产生完全相同的核心转储(假设其他编译标志是相同的,并且应用程序从运行到运行都是可重复的)。
需要调试信息才能理解调试器中的内存转储。但是您也可以理解没有调试信息的内存转储,它只是更多的手工和乏味。
是否有更多的信息,包括调用堆栈?
你说你已经有电话堆栈了。
最佳实践是始终使用完整的调试信息构建应用程序。
gcc -O2 -g -c foo.cc -o foo.o
gcc -g foo.o bar.o ... -o app然后保留生成的(大的)二进制以进行调试,但将该二进制的剥离变体发送给最终用户:
cp app app-stripped
strip -g app-stripped # removes all debug info from app-stripped现在,当您从应用程序剥离得到一个内核转储时,请使用完全调试的app来分析该核心。
或者,您可以使用单独的调试器文件,如文档化的这里。
https://stackoverflow.com/questions/27495354
复制相似问题