如何找出导致"cv ::内存位置异常"的原因?

mem*_*elf 10 c++ visual-studio-2010 visual-c++

我目前正遭受一些奇怪的异常,这些异常很可能是由于我在与opencv交互时做错了一些事情:

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

我已经ThrownDebug -> Exceptions菜单中启用了该字段,但是我真的无法弄清楚我的代码中抛出异常的位置.

我该怎么调试呢?

编辑 堆栈帧就像这样(我的应用程序甚至不会显示在列表中!):

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

Ben*_*enj 13

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

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

  • 这是一个开始!我不得不使用`e.what()`而不是`e.msg()`.现在我得到了至少opencv错误,但我仍然不知道我的程序在哪里导致这个错误.有没有办法搞清楚? (2认同)
  • 当您捕获它时,您实际上无法自动查看C++异常的堆栈跟踪原点,因为堆栈已经解开.与Java/C#异常相比,这是对它们的常见批评. (2认同)

tr3*_*r3w 5

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

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

cv::setBreakOnError(true);
Run Code Online (Sandbox Code Playgroud)

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