【问题标题】:how to debug c++ runtime errors如何调试 C++ 运行时错误
【发布时间】:2013-06-07 16:45:11
【问题描述】:

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

【问题讨论】:

标签: c++ mingw runtime-error codeblocks


【解决方案1】:

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

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

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

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

【讨论】:

  • 我对@9​​87654323@ 了解不多,但以我的经验Eclipse(对于C/C++ 开发人员——包括cdt、gdb、...)是一个相当不错的环境。
【解决方案2】:

您可以使用调试器,例如 GDB(文档:http://www.gnu.org/software/gdb/documentation/)就个人而言,我认为发现错误的最佳方法是自己调试代码。一个有用的代码sn-p:

#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!
}

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      我知道使用 gdb 曲线过于陡峭,但这里有一个 link 的 gdb 教程,您可以从那里开始使用 gdb 进行调试。!! 另外,如果您不熟悉使用终端编译和使用它,那么,

      您在终端上使用g++ <em>file_name</em> -o <em>ouput_file_name</em> 编译c++ 程序
      然后运行你做的程序: ./<em>output_file_name</em>

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        • 2012-07-11
        • 1970-01-01
        • 2011-12-20
        相关资源
        最近更新 更多