解决方法
cc -g -c file1.c cc -g -c file2.c cc -g file1.o file2.o -o program ./program
那么当你运行程序,如果它崩溃它应该产生一个更容易调试的核心文件.前两行只是编译源文件(生成.o文件),第三行告诉编译器调用链接器将源文件链接到一个可执行文件中(如果链接器不需要做任何特殊的事情来生成带有调试符号的可执行文件,但它不应该伤害任何东西),最后一行运行程序.您应该确保在尝试调试时不要告诉编译器进行优化(除非您发现除非优化已打开,否则不会出现错误),因为优化通常会使更难以遵循.
既然我不知道你在使用什么平台,或者你可以使用什么工具(甚至是甚至使用C编译器),所以很难给出更具体的建议.您应该阅读您的编辑器的手册页(手册).从命令行类型:
man cc
这应该会出现一个手册页面,它告诉你有关系统上编译器的许多事情.这可能会告诉您如何告诉编译器产生更多的警告消息,这可以帮助您在运行程序之前找到错误. (请注意,只有在您启用某些优化程序进行编译时,才会生成一些警告,因此即使您可能不想调试优化的程序,您可能希望通过优化和额外的警告来编译它,只是为了查看它们是否告诉你什么)
您的Unix系统可能安装了某种类型的调试器.大多数用于C开发的Linux机器都安装了gdb. gdb可用于以调试模式运行程序或分析核心文件.如果你有gdb,你可以:
gdb ./program
它将启动准备运行您的程序.如果你这样做:
gdb ./program ./core
它将表现类似,除了它将像您正在调试,您的程序刚刚崩溃.从这个状态,你可以做的最快最有帮助的事情就是
(gdb) bt
这里(gdb)是提示符,bt是一个表示生成后跟的命令.这意味着一个调用堆栈,它显示了程序在发生故障时的功能,以及称为该函数的什么函数,以及称为该函数的函数,以及第一个函数的on和on.这可能会令人困惑,因为它通常会将库函数显示为最近调用的函数,但这通常意味着您在导致问题的途中将某些坏数据传递到某处.
gdb是一个大而复杂的程序,所以如果它在你的系统上,你应该花时间阅读它.
如果不在系统上,那么你应该找出类似的工具.一些图形调试器(在IDE内部)作为命令行调试器的前端,有些甚至支持几个不同的命令行调试器,因此如果您能够使用其中一个图形调试器,您可能不必担心关于正在使用什么实际的后端命令行调试器.