调试导致异常? 我从Visual Studio 2K3中用C++编写的应用程序获得坏数据,所以我决定调试它。然后我发现它抛出了一个异常,但我无法跟踪

调试导致异常? 我从Visual Studio 2K3中用C++编写的应用程序获得坏数据,所以我决定调试它。然后我发现它抛出了一个异常,但我无法跟踪,c++,debugging,exception,visual-c++,C++,Debugging,Exception,Visual C++,然后我放置了一些try/catch块和low,当我不调试时,也没有例外。也就是说,我有如下代码: std::stuff的向量列表; . . . 尝试 { . . . const MyClass*localPointer=listofsuff[i];//这就是发生异常的地方 . . } 捕获(…) { int x=0;//在此处放置断点 } 因此,如果我逐行遍历代码,我将得到一个异常,并立即捕获。但是如果我只是让它在catch中运行一个断点,什么也不会发生。使用迭代器具有相同的行为。我可以成功

然后我放置了一些try/catch块和low,当我不调试时,也没有例外。也就是说,我有如下代码:


std::stuff的向量列表;
.
.
.
尝试
{
.
.
.
const MyClass*localPointer=listofsuff[i];//这就是发生异常的地方
.
.
}
捕获(…)
{
int x=0;//在此处放置断点
}
因此,如果我逐行遍历代码,我将得到一个异常,并立即捕获。但是如果我只是让它在catch中运行一个断点,什么也不会发生。使用迭代器具有相同的行为。我可以成功地检查向量的大小,这样我就知道我在范围之内。

谁能告诉我发生了什么事?如果重要的话,我正在使用一些标准的windows库和openGL。

异常是断言吗?它们可能在编译时编译出来,或者抛出断言

例如,你可以

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

异常是断言吗?它们可能在编译时编译出来,或者抛出断言

例如,你可以

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

如果您使用的是一个好的IDE,它允许有条件的断点(例如,“如果i==5,在这里中断”),那么可能是条件本身导致了异常


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

如果您使用的是一个好的IDE,它允许条件断点(例如,“如果I==5,请在此中断”),那么条件本身就可能导致异常

有那么一段时间了。。。当我发现它时,我的头很痛。

你可以试着放一个

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

您可以尝试放置

DebugBreak();

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

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


您可能需要仔细研究要捕获的类型(一些第一次机会异常实际上不是问题),但这将有助于确定异常提出的点。

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


您可能需要仔细研究要捕获的类型(一些第一次出现的异常实际上不是问题),但这将有助于确定引发异常的点。

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

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

不是断言,我没有使用条件中断和DebugBreak的行为方式相同(但我以前不知道,这很方便)。不是断言,我没有使用条件中断和DebugBreak的行为方式相同(但我以前不知道,这很方便)。