我经常使用GDB来调试C/C++程序,并且我对它的工作原理和功能相当了解。
然而,我经常会遇到一些问题,奇怪的是,我似乎不能让GDB从核心文件中正确加载符号。
目前,我在一个共享的NFS目录中有一个二进制可执行文件。该可执行文件肯定是使用-g3标志编译的。可执行文件崩溃,并将一个核心文件转储到我的Linux机器的/home目录中。
由于某些原因,我不能让GDB从core文件中加载符号。
当我尝试的时候:
$ gdb <executable_file> <core_file>GDB加载,但我无法获得回溯,并且没有加载调试符号。
如果我运行GDB,然后在GDB提示符下输入core <core file name>,它将加载核心文件,并且我看到核心文件肯定与先前崩溃的二进制可执行文件相关联。然而,GDB报告“无法从内存中读取有效的目标文件图像”,因此我无法获得有意义的回溯,并且没有加载调试符号。
有人知道这可能是什么原因吗?通常,让GDB正确加载核心文件并读入调试符号没有问题,但在这种情况下,它不起作用。会不会是因为二进制可执行文件存储在共享的NFS挂载上?
发布于 2010-08-15 23:25:26
检查你的ulimits。这是一个相当常见的混乱来源。截断的核心文件可以使任何形式的gdb检查变得无用,在大多数情况下,您可以读取二进制文件的名称,如果核心文件至少为8k,则可以获得堆栈跟踪。
发布于 2010-08-16 00:43:56
是否加载了所有共享库?试一试
$ ldd <executable_file> 看看这能不能帮你弄清楚。
https://stackoverflow.com/questions/3487537
复制相似问题