我有这样的情况。在我的代码中,有无数像这样的代码块。
try
{
DoSomething();
}
catch( Ogre::Exception& e )//Yes, I'm using Ogre, but you get the idea :)
{
MessageBoxA( NULL, e.getFullDescription().c_str(), "An exception has occured!",
MB_OK | MB_ICONERROR | MB_TASKMODAL );
}
我不想在每个catch块都放置断点。因此,每次抛出异常时,都会显示一个消息框 - 我单击确定并编程关闭。
我想要的是在消息框中单击“确定”后,Visual Studio在消息框线程中捕获调试,我可以看到源代码中发生了什么。
注意:我不知道'catch debug'是否是一个合适的词,当我说'catch debug'时,我的意思是:激活'Step into'(F11)/'Step over'(F10)Debug的功能模式 - >出现源边缘的黄色箭头。也许正确的词是'休息'。
PS:在我的情况下,我可以使用'Exception settings'(对于早于2015的VS,检查this post)来突破所有C ++异常。然后当抛出任何C ++异常时,我的VS 2015将会破坏让我看看会发生什么。然而,我仍然想要解决这个问题,也许有些情况下,它不是例外而只是消息框 - 然后需要在消息框显示后打破的技能。
答案 0 :(得分:1)
你低估了Exception Settings
的力量。它允许您仔细筛选出要拦截的异常类型。打开Exception Settings
窗口,取消选中“C ++ Exceptions”复选框,选择“C ++ Exceptions”项(这样整行突出显示,这也会激活工具栏上的“+”按钮),按“+”按钮(或使用上下文菜单)条目)将Ogre::Exception
类型添加到例外列表中,选中Ogre::Exception
复选框,以便只拦截它。
答案 1 :(得分:1)
如果您使用了MessageBox宏而不是隐式使用MessageBoxA,那么您可以在之后重新定义插入DebugBreak()的宏。
我想我现在要尝试的是在User32上放置一个断点!MessageBoxA。这样您就可以在执行每个消息框之前休息一下。然后你F10那个将执行消息框的调用,当你按OK时它返回调试器,你可以检查你的代码。
答案 2 :(得分:1)
添加评论作为解决方案:
在VS2017中,您可以使用工具 - >选项 - >调试下的名为“Using the New Exception Helper”的新功能。它可以提供比以前版本更多的调试信息,例如打破代码行或更快地打破未处理的异常等。
答案 3 :(得分:0)
如果要在输入catch
块后立即停止执行,则需要使用DebugBreak()
之类的功能。以下是您可以尝试的代码段:
try
{
throw out_of_range("hello, stackoverflow");
}
catch (exception& e)
{
// Exection wil stop here.
// You will see the exception thrown above in the Output console.
DebugBreak();
}
请注意,它也适用于Release版本,不仅适用于Debug。
修改强>
如果你想要那个黄色箭头,你可以使用
try
{
throw out_of_range("hello, stackoverflow");
}
catch (exception& e)
{
// Now you will get the yellow arrow.
// From here, you could acces the call stack console that VS provides.
// By the way, you could have also done that in the previous example.
int b[1];
b[1000] = 0;
}