我使用MinGW作为编译器,使用CodeBlocks作为IDE。当出现运行时错误时,程序只是停止工作而没有任何错误消息。是否有可能获得传统的错误消息,例如错误的类型和发生的位置?
答案 0 :(得分:5)
我知道这不是一个真正的'答案',但我还是新的,所以我还不能评论这些问题。无论如何,和Mats说的一样,试试GDB。这是下载页面http://www.gnu.org/software/gdb/
有很多使用调试器的教程。这个相当不错。 http://www.cs.cmu.edu/~gilpin/tutorial/
如果您从未使用过调试器,它基本上会逐行运行您的代码。您可以控制要继续的进度以及希望代码停止检查错误的位置。调试器还会跟踪其他重要信息,如变量值,变量地址,循环计数等。
如果您不想使用调试器,则始终可以使用可能怀疑程序崩溃的打印语句。例如,如果你有一个函数foo(),你可以在该函数的第一行写一个print语句,说“on function foo”。但是,如果您有大量代码,这种方法可能会变得非常繁琐。您还必须记得在完成后删除打印语句。
答案 1 :(得分:2)
您可以使用调试器,如GDB(文档:http://www.gnu.org/software/gdb/documentation/)就个人而言,我认为发现错误的最佳方法是自己调试代码。一个有用的代码段:
#ifdef DEBUG
#define debug(...) do { fprintf(stderr, __VA_ARGS__); } while(false)
#else
#define debug(...) do { } while(false)
#endif
如果您怀疑自己正在访问数组中的无效位置,可以尝试以下操作:
#include <cassert>
...
int main() {
int a[5], i;
...
assert(i >= 0 && i < 5);
}
或者,如果您喜欢纯C ++,
#include <stdexcept>
...
int main() {
int a[5], i;
...
if(i < 0 || i >= 5) {
throw std::runtime_error("Error: trying to access invalid memory");
}
}
如果要调试递归函数(一种非常常见的运行时错误源),请在函数的开头和结尾添加检查,也可以在每次递归调用之前或之后添加检查。例如:
int fibo(int n) {
return fibo(n-1) + fibo(n-2); // error recursion doesn't end, stuck at infinite loop
}
在函数开头的简单检查将帮助您轻松发现错误(我知道这里很容易找到程序崩溃的原因,但是在一个更复杂的函数中,如图上的DFS(DFS:{{3找到程序导致错误的原因可能会更棘手。
int fibo(int n) {
if(n < 0) {
debug("Error!");
return -1;
}
return fibo(n-1) + fibo(n-2); // mistake spotted!
}
答案 2 :(得分:1)
要确定错误发生的位置,请在调试模式下运行程序(通过单击行号旁边的设置断点;将出现红色停止符号)。这将导致程序暂停在标记的行上执行。然后,您可以跳到下一行(F7)或继续下一个断点(shift + F7)。这将允许您推断出错误发生的位置。
对于错误代码,一旦程序停止工作,控制台将输出错误代码。例如,以下内容:
Process returned -1073741819 (0xC0000005) execution time : 1.045 s
Press any key to continue.
表示内存错误,在这种情况下我尝试删除非动态变量。 只需谷歌十六进制代码。
答案 3 :(得分:1)
我知道使用gdb是一个太陡峭的曲线但是这里有一个link到gdb的教程,你可以从那里开始用gdb调试。!! 此外,如果您不熟悉使用终端进行编译并使用它,那么
使用g++ file_name -o ouput_file_name
在终端上编译 c ++程序
然后运行你执行的程序: ./output_file_name
(虽然我是初学者)希望它有助于...... !!!