C和C++最佳调试工具

15

我正在UNIX上使用C/C++进行开发,经常看到核心文件。很多时候,核心文件很难调试以找到实际的核心或分段错误的原因。你能否建议一个高效的调试器?


3
你正在使用哪个编译器?调试器需要读取编译器生成的调试符号。通常情况下,gdb与gcc配合最好,dbx与Sun CC配合最好等等。 - Rup
1
Sachin:这并没有告诉我们太多信息。指的是哪个cc?指的是哪个UNIX系统? - Ken
如果我们不知道使用哪个编译器或操作系统,那么我们真的无法提供太多帮助。投票关闭,因为这不是一个真正的问题。 - David Thornley
我可以知道为什么被踩了吗? - Sachin Chourasiya
@Sachin Chourasiya:刚刚阅读了评论。您提供的信息太少,无法得出有意义的答案。 - sleske
6个回答

13

对于分段错误,内存泄漏,未初始化数据等问题,通过valgrind运行程序总是一个好主意。如果您特别关注内存泄漏,则选项"--leak-check=full"非常有用。

而且,请学习gdb。这需要一些时间,但它是值得的。


请注意,如果您有一种可靠的方法来重现核心并想要确定原因,那么您可以执行以下操作。Valgrind不处理已经生成的核心文件。 - aschepler

10

我认为大多数*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机器都安装了gdbgdb可用于以调试模式运行程序或分析核心文件。如果您有gdb,则可以:

gdb ./program

它将启动并准备运行您的程序。如果您执行以下操作:

gdb ./program ./core

它的行为方式类似,只是好像你正在调试程序,而程序刚刚崩溃了一样。从这种状态下,你可以做的最快、最有帮助的事情是

(gdb) bt

(gdb) 是提示符,bt 是一个命令,它表示产生一个回溯(back-trace),即调用栈,展示程序在故障发生时所处的函数以及调用该函数的函数、调用该函数的函数以及一直追溯到第一个函数。这可能会令人困惑,因为它通常会显示库函数作为最近被调用的函数,但这通常意味着您已经在某个地方传递了一些错误的数据,导致出现问题。

gdb 是一个大而复杂的程序,如果它在您的系统上,请花时间阅读相关文档。

如果它不在您的系统上,则应找出类似的工具。一些图形化调试器(无论是内嵌于 IDE 中还是独立的)充当命令行调试器的前端,并且甚至支持多种不同的命令行调试器,因此,如果您能够使用其中之一,那么实际后端命令行调试器是什么并不重要。


8

使用gdb。它是事实上的标准Unix C/C++调试器,从7.0版本开始具有可逆调试功能(您可以倒退时间)。仅这些原因就足以使其值得一试。


3

我非常喜欢Totalview。并行调试功能是我喜欢它的原因。


2

通常情况下,gdb是一款非常优秀的调试器(尽管需要一点时间来学习)。此外,还有一些带有图形界面的前端工具,例如DDD或cgdb。

如果您能说明具体遇到的问题,我们可能会更好地推荐哪个调试器最适合您。


0
如上所述,gdb 是一个优秀的调试器。但在 Linux 终端中使用 gdb 调试大型项目会更加复杂。简单的原因是它完全是命令行界面。因此,我建议使用 kdevelop,它内部以图形方式使用 gdb。这个调试工具在以非常简单的方式调试我的大型项目方面帮助了我很多。如果您需要使用此工具的任何帮助,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接