2

我使用 MinGW 作为编译器,使用 CodeBlocks 作为 IDE。当出现运行时错误时,程序会停止工作而不会出现任何错误消息。是否可以获得常规错误消息,例如错误类型和发生位置?

4

4 回答 4

6

我知道这不是一个真正的“答案”,但我还是新手,所以我还不能对这些问题发表评论。无论如何,和 Mats 说的一样,试试 GDB。这是下载页面http://www.gnu.org/software/gdb/

有很多使用调试器的教程。这个还算不错。 http://www.cs.cmu.edu/~gilpin/tutorial/

如果您从未使用过调试器,它基本上会逐行运行您的代码。您可以控制要进行多远以及希望代码停止以检查错误的位置。调试器还跟踪其他重要信息,如变量值、变量地址、循环计数等。

如果您不想使用调试器,您总是可以在您怀疑程序崩溃的地方使用打印语句。例如,如果你有一个函数 foo(),你可以在该函数的第一行添加一个 print 语句,比如“in function foo”。但是,如果您有大量代码,此方法可能会变得非常乏味。您还必须记住在完成后删除打印语句。

于 2013-06-07T16:56:07.723 回答
3

您可以使用调试器,例如 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:http://en. wikipedia.org/wiki/Depth-first_search),找到程序导致错误的原因可能更棘手。

int fibo(int n) {
  if(n < 0) {
    debug("Error!");
    return -1;
  }
  return fibo(n-1) + fibo(n-2); // mistake spotted!
}
于 2013-06-07T17:13:24.457 回答
2

我知道使用 gdb 曲线太陡峭,但这里有一个指向 gdb 教程的链接,您可以从中开始使用 gdb 进行调试。!!另外,如果您不熟悉使用终端编译并使用它,

您在终端上使用然后运行您执行的程序来编译c++ 程序:g++ file_name -o ouput_file_name
./output_file_name

(虽然我是初学者)希望它有帮助..!!!

于 2013-06-07T17:11:27.057 回答
2

要确定错误发生的位置,请在调试模式下运行程序(通过单击行号旁边的设置断点;将出现红色停止标志)。这将导致您的程序在标记的行上暂停执行。然后,您可以跳到下一行 (F7) 或继续到下一个断点 (shift+F7)。这将允许您推断错误发生的位置。

至于错误码,一旦你的程序停止工作,控制台就会输出错误码。例如,以下内容:

Process returned -1073741819 (0xC0000005)   execution time : 1.045 s
Press any key to continue.

表示内存错误,在这种情况下,我试图删除一个非动态变量。只需谷歌十六进制代码。

于 2013-06-07T16:57:07.213 回答