调试导致异常?

Posted

技术标签:

【中文标题】调试导致异常?【英文标题】:Debugging causing exceptions? 【发布时间】:2008-10-17 22:57:44 【问题描述】:

我在 Visual Studio 2k3 中使用 C++ 编写的应用程序收到了错误数据,因此我决定对其进行调试。然后我发现它抛出了一个异常,但我无法追踪。

然后我放置了一些 try/catch 块,并且看,当我不调试时没有异常。也就是说,我的代码如下所示:

std::vector<MyClass*> ListOfStuff;
.
.
.
try

.
.
.
   const MyClass * localPointer = ListOfStuff[i]; //This is where the exception occurs
.
.

 catch (...)

   int x = 0;  //place break here

因此,如果我逐行逐行执行代码,我会得到一个异常并抓住机会。但是,如果我只是让它在 catch 内的断点下运行,则不会发生任何事情。使用迭代器具有相同的行为。而且我可以成功检查向量的大小,所以我知道我在范围内。 谁能告诉我发生了什么事?如果重要的话,我会使用一些标准的 Windows 库和 openGL。

【问题讨论】:

不是一个断言,我没有使用条件中断,而 DebugBreak 的行为方式相同(但我以前不知道,这很方便)。 【参考方案1】:

您可以尝试放置一个

DebugBreak();

调用catch 子句。如果应用程序在调试器中运行,它应该获得控制权。如果它没有在调试器中运行,您应该有机会附加“及时”调试器(如果您安装了 Visual Studio,通常是 Visual Studio)。

【讨论】:

【参考方案2】:

我指的是 VS2005,但它应该适用于您的情况。如果您访问 IDE Debug > Exceptions.. 菜单项,您可以指定 IDE 调试器在 抛出 时应该中断的异常类型导致您在单步执行应用程序时看到引发异常的行。

您可能需要考虑要捕获的类型(一些第一次机会异常实际上并不是问题),但这有助于确定引发异常的点。

【讨论】:

【参考方案3】:

异常是断言吗?这些可能会在编译时被编译出来或者抛出一个断言。

例如,你可以有

#ifdef DEBUG
#define ASSERT(cond) if (cond) throw CDebugAssertionObj;
#else
#define ASSERT(cond)
#endif

【讨论】:

【参考方案4】:

如果您使用的是允许条件断点的良好 IDE(例如,“如果 i == 5 则在此处中断”),那么条件本身可能会导致异常。

有一段时间了...当我找到它时,我的头很痛。

【讨论】:

【参考方案5】:

该代码是类方法的一部分,ListOfStuff 是该类的成员吗?如果是这样,请检查以确保您的 this 指针有效。

【讨论】:

以上是关于调试导致异常?的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse Android 调试器 - 我的代码在哪里导致异常?

是调试断点导致的“EXC_BREAKPOINT (SIGTRAP)”异常吗?

零基础学Python--------第9章 异常处理及程序调试

如何检测大对象堆是不是导致内存不足异常

原Maven解决jar冲突调试步骤:第三方组件引用不符合要求的javassit导致的相关异常

NSPredicate predicateWithFormat 导致异常