我在UNIX上从事C/C++工作,经常看到核心文件.很多时候核心文件很难调试,以找到核心或分段错误的实际原因.你能建议我一个高效的调试器吗?
我认为大多数*nix支持的大多数C编译器都支持-g在目标文件中包含调试符号,所以如果你这样做:
cc -g -c file1.c
cc -g -c file2.c
cc -g file1.o file2.o -o program
./program
Run Code Online (Sandbox Code Playgroud)
然后当你运行程序时如果它崩溃它应该产生一个更容易调试的核心文件.前两行只是编译源文件(生成.o文件),第三行告诉编译器调用链接器将源文件链接到可执行文件(-g如果链接器不需要做任何事情,那么传递到这里可能实际上没有做任何事情特殊的,用调试符号生成一个可执行文件,但它不应该伤害任何东西),最后一行运行程序.您应该确保在尝试调试时不要告诉编译器进行优化(除非您发现除非启用了优化,否则它没有错误),因为优化通常会使更难以遵循.
由于我不知道你所使用的平台或者你可以使用的工具(或者甚至是你正在使用的C编译器),因此很难提供更具体的建议.您应该阅读编译器的手册页(手册).从命令行类型:
man cc
Run Code Online (Sandbox Code Playgroud)
这应该会打开一个手册页,告诉你很多关于你系统上编译器的事情.这可能会告诉您如何告诉编译器生成更多警告消息,这可以帮助您在运行程序之前找到错误.(请注意,如果您在打开某些优化的情况下进行编译,则可能只会产生一些警告,因此即使您可能不想调试优化程序,也可能需要通过优化编译它并打开额外警告,看看它们是否有效告诉你什么).
你的Unix系统可能安装了某种类型的调试器.已经gdb安装了大多数为C开发设置的Linux机器. gdb可用于在调试模式下运行程序或分析核心文件.如果你有gdb,你可以:
gdb ./program
Run Code Online (Sandbox Code Playgroud)
它将开始准备运行您的程序.如果你这样做:
gdb ./program ./core
Run Code Online (Sandbox Code Playgroud)
它会表现得类似,只不过它就好像你在调试而你的程序崩溃了.从这个状态,你可以做的最快,最有帮助的事情是
(gdb) bt
Run Code Online (Sandbox Code Playgroud)
这(gdb)是提示符,bt是一个命令,表示产生一个回溯.这意味着一个调用堆栈,它显示了失败发生时程序所处的功能,以及调用该函数的函数,以及调用该函数的函数,以及直到第一个函数.这可能会让人感到困惑,因为它通常会将库函数显示为最近调用的函数,但这通常意味着您在导致问题的路上传递了一些不良数据.
gdb 是一个庞大而复杂的程序,所以如果它在你的系统上,你应该花时间阅读它.
如果它不在您的系统上,那么您应该找出类似的工具.一些图形调试器(在IDE中或不在IDE中)充当命令行调试器的前端,有些甚至支持几个不同的命令行调试器,因此如果您能够使用其中一个图形调试器,您可能实际上不必担心关于使用什么实际的后端命令行调试器.