我正在UNIX上使用C/C++进行开发,经常看到核心文件。很多时候,核心文件很难调试以找到实际的核心或分段错误的原因。你能否建议一个高效的调试器?
对于分段错误,内存泄漏,未初始化数据等问题,通过valgrind运行程序总是一个好主意。如果您特别关注内存泄漏,则选项"--leak-check=full"非常有用。
而且,请学习gdb。这需要一些时间,但它是值得的。
我认为大多数*nix上的C编译器都支持-g
,可以在目标文件中包含调试符号,所以如果你这样做:
cc -g -c file1.c
cc -g -c file2.c
cc -g file1.o file2.o -o program
./program
如果程序崩溃,应生成更易于调试的核心文件。前两行只是编译源文件(生成.o文件),第三行告诉编译器调用链接器将源文件链接为可执行文件(在这里传递-g
可能实际上不会做任何特殊处理以生成带有调试符号的可执行文件,但它不应该影响任何东西),最后一行运行程序。在尝试调试时,应确保不要让编译器进行优化(除非您发现只有在打开优化时才没有错误),因为优化通常使得代码更难跟踪。
由于我不知道你使用的平台或可用的工具(甚至不知道你使用的C编译器),因此很难给出更具体的建议。您应该阅读您的编译器手册。从命令行键入:
man cc
这会打开一个手册页面,告诉您关于系统上编译器的许多信息。这可能会告诉您如何告诉编译器产生更多的警告信息,在运行程序之前就可以帮助您找到错误。(请注意,有些警告只有在使用某些优化选项编译时才会产生,因此即使您可能不想调试优化后的程序,您也可能需要使用优化和额外警告来编译它,以查看它们是否有任何提示)。
您的Unix系统可能已安装了某种类型的调试器。大多数用于C开发的Linux机器都安装了gdb
。 gdb
可用于以调试模式运行程序或分析核心文件。如果您有gdb,则可以:
gdb ./program
它将启动并准备运行您的程序。如果您执行以下操作:
gdb ./program ./core
它的行为方式类似,只是好像你正在调试程序,而程序刚刚崩溃了一样。从这种状态下,你可以做的最快、最有帮助的事情是
(gdb) bt
(gdb)
是提示符,bt
是一个命令,它表示产生一个回溯(back-trace),即调用栈,展示程序在故障发生时所处的函数以及调用该函数的函数、调用该函数的函数以及一直追溯到第一个函数。这可能会令人困惑,因为它通常会显示库函数作为最近被调用的函数,但这通常意味着您已经在某个地方传递了一些错误的数据,导致出现问题。
gdb
是一个大而复杂的程序,如果它在您的系统上,请花时间阅读相关文档。
如果它不在您的系统上,则应找出类似的工具。一些图形化调试器(无论是内嵌于 IDE 中还是独立的)充当命令行调试器的前端,并且甚至支持多种不同的命令行调试器,因此,如果您能够使用其中之一,那么实际后端命令行调试器是什么并不重要。
我非常喜欢Totalview。并行调试功能是我喜欢它的原因。
通常情况下,gdb
是一款非常优秀的调试器(尽管需要一点时间来学习)。此外,还有一些带有图形界面的前端工具,例如DDD或cgdb。
如果您能说明具体遇到的问题,我们可能会更好地推荐哪个调试器最适合您。
cc
?指的是哪个UNIX系统? - Ken