来自this之类的帖子我知道如何对调试版应用生成的核心转储文件进行分析。对于核心转储文件,我也可以使用gdb工具和bt命令获取调用堆栈。
但是当使用其他命令如信息本地,列表,打印本地变量等时,我发现它们什么也没显示!令我惊讶的是,这个核心转储文件与调试版应用程序生成的文件一样大,大小为1.6G字节!
有没有获得更多信息,包括调用堆栈?在生成核心转储时,是否可以在最后一次函数调用中查看有关变量的其他详细信息?
答案 0 :(得分:2)
令我惊讶的是,这个核心转储文件与调试版应用程序生成的文件一样大,大小为1.6G字节!
你不应该对此感到惊讶。核心转储包含应用程序内存的可修改段。使用调试信息编译的应用程序将具有与没有调试信息编译的应用程序完全相同的可修改内存,并且应该生成完全相同的核心转储(假设其他编译标志相同,并且应用程序在运行期间可重复)。
需要调试信息才能理解调试器中的内存转储。但是你也可以在没有调试信息的情况下理解内存转储,它只是更加手动和乏味。
有没有获得更多信息,包括调用堆栈?
你说已经拥有调用堆栈。
最佳做法是始终使用完整的调试信息构建您的应用程序,例如
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-stripped获得核心转储时,请使用完整调试app
来分析该核心。
或者,您可以使用单独的debuginfo文件,如记录here。