【问题标题】:how to find out what is causing "cv::Exception at memory location"?如何找出导致“cv::Exception at memory location”的原因?
【发布时间】:2012-09-23 03:39:56
【问题描述】:

我目前遇到了一些奇怪的异常,这很可能是由于我在与 opencv 交互时做错了什么:

First-chance exception at 0x7580b9bc in xxx.exe: Microsoft C++ exception: cv::Exception at memory location 0x00c1c624..

我已经在Debug -> Exceptions 菜单中启用了Thrown 字段,但是我真的不知道在我的代码中哪里抛出了异常。

我该如何调试呢?

编辑 堆栈帧如下所示(我的应用程序甚至不会出现在列表中!):

  • KernelBase.dll!7580b8bc()
  • [下面的帧可能不正确或缺失]
  • KernelBase.dll!7580b8bc()
  • opencv_core242d.dll!54eb60cc()

【问题讨论】:

  • 您是否使用调试器介入并查看导致异常的行??
  • @TonyTheLion 我很想这样做,但不幸的是我什至不知道在我的代码中哪里抛出了异常。我能看到的只有反汇编。
  • 异常是真的终止了你的程序还是被处理了?
  • 如果你没有捕捉到异常,那么你只需在调试器中运行程序,当抛出异常时它会自动停止。所以你不需要知道它在哪里抛出,调试器会告诉你。
  • 它有一个错误描述字段:www710.univ-lyon1.fr/~eguillou/documentation/opencv2/… 它包含什么?

标签: c++ visual-studio-2010 visual-c++


【解决方案1】:

您可以将整个 main 包装在一个 try catch 块中,该块会打印出异常详细信息。如果开放的 CV API 可以抛出异常,您将需要考虑将它们作为设计的一部分进行处理:

try
{
  // ... Contents of your main
}
catch ( cv::Exception & e )
{
 cerr << e.msg << endl; // output exception message
}

【讨论】:

  • 这是一个开始!我不得不使用e.what() 而不是e.msg()。现在我至少得到了 opencv 错误,但我仍然不知道在我的程序中这个错误是在哪里引起的。有办法解决吗?
  • @memyself 您应该能够通过在调试器中单步执行直到突然进入 catch 块来解决这个问题。一旦发生这种情况,请仔细查看从您的代码中调用的最后一个 Open CV 函数。
  • 问题是,程序是随机发生的,而且只有当用户用鼠标做某事时。因此,逐步完成它直到发生错误是非常复杂的。我在想应该有办法给我行号,一旦调试器位于catch 块中 - 或者这不可能?
  • CV 异常有各种属性:www710.univ-lyon1.fr/~eguillou/documentation/opencv2/… 你能不能用这些信息来确定哪个打开的 cv 函数抛出了异常?
  • 当你捕捉到 C++ 异常时,实际上并不能自动看到堆栈跟踪的来源,因为堆栈已经展开。与 Java/C# 异常相比,这是对它们的普遍批评。
【解决方案2】:

我通过使用带有 WebCam 的 OpenCV 遇到了这个问题。就我而言,问题是程序在 Cam 尚未初始化时尝试读取图像。

我的错误代码:

 // open camera
capture.open(0);
while (1){
    //store image to matrix // here is the bug
    capture.read(cameraFeed);

解决办法

 // open camera
capture.open(0);
while (1){

     //this line makes the program wait for an image 
     while (!capture.read(cameraFeed));

    //store image to matrix 
    capture.read(cameraFeed);

(对不起我的英语) 谢谢

【讨论】:

    【解决方案3】:

    OpenCV 有一个名为cv::setBreakOnError 的方便函数

    如果您在任何 opencv 调用之前将以下内容放入您的 main 中:

    cv::setBreakOnError(true);
    

    那么你的程序将会崩溃,因为 OpenCV 会在正常抛出 cv::Exception 之前执行无效操作(取消引用空指针)。如果您在调试器中运行您的代码,它将在这个非法操作处停止,并且您可以看到整个调用堆栈以及错误发生时的所有代码和变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2014-01-17
      • 1970-01-01
      • 2017-07-22
      • 2013-05-27
      • 1970-01-01
      • 2011-10-08
      相关资源
      最近更新 更多