Visual Studio - 如何在显示消息框后

时间:2017-10-02 03:43:55

标签: c++ visual-studio debugging visual-studio-2015 visual-studio-debugging

我有这样的情况。在我的代码中,有无数像这样的代码块。

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将会破坏让我看看会发生什么。然而,我仍然想要解决这个问题,也许有些情况下,它不是例外而只是消息框 - 然后需要在消息框显示后打破的技能。

4 个答案:

答案 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;
}