Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Visual studio-如何在显示消息框后捕获调试(中断)_C++_Visual Studio_Debugging_Visual Studio 2015_Visual Studio Debugging - Fatal编程技术网

C++ Visual studio-如何在显示消息框后捕获调试(中断)

C++ Visual studio-如何在显示消息框后捕获调试(中断),c++,visual-studio,debugging,visual-studio-2015,visual-studio-debugging,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_ICONERR

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

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块上都设置断点。所以每次抛出异常时,都会出现一个消息框——我单击ok并关闭程序

我想要的是在我单击消息框上的Ok之后,VisualStudioCatch debug在消息框线程中,我可以看到在源代码中发生了什么

注意:我不知道“catch debug”是否是一个合适的词,当我说“catch debug”时,我的意思是:激活调试模式的“单步执行”(F11)/“单步执行”(F10)功能-->在源代码的空白处出现一个黄色箭头。也许正确的词是“打破”


PS:在我的情况下,我可以使用“(大于2015岁,检查)”来在抛出所有C++异常时中断。然后当任何C++异常被抛出时,我的VS 2015就会崩溃,让我看看会发生什么。然而,我仍然想解决这个问题,可能有些情况下它不是例外,只是消息框-然后需要在消息框显示后中断的技能。

如果您想在进入
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();
}
请注意,它也将在发布版本上工作,而不仅仅是在调试中

编辑
如果你想要的正是那个黄色箭头,你可以使用一个肮脏的黑客,这是非常非常糟糕的做法

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

您低估了异常设置的功能。它允许您仔细筛选出要拦截的异常类型。打开
异常设置
窗口,取消选中“C++异常”复选框,选择“C++异常”项目(因此整行高亮显示,这也将激活工具栏上的“+”按钮),按“+”按钮(或使用上下文菜单项)将
Ogre::Exception
类型添加到异常列表中,选中
Ogre::Exception
复选框,以便只截取它。

如果您使用了MessageBox宏而不是隐式使用MessageBoxA,则可以在之后重新定义插入DebugBreak()的宏


我想我现在要尝试的是在User32上放置一个断点!MessageBoxA。这样,在执行每个消息框之前,您可以获得一个中断。然后,您将调用F10,该调用将执行消息框,当您按OK时,它将返回到debugger,您可以检查代码。

添加注释作为解决方案:


在VS2017中,您可以在工具->选项->调试下使用名为“”的新功能。与以前的版本相比,它可以提供更多的调试信息,如中断代码行或更快地中断未处理的异常等。

如果已将调试器连接到进程,您可以点击F12进入调试器,然后查找调用堆栈以查找代码中的位置。或者使用调试器的“暂停”选项中断执行并查找调用堆栈。或添加
断言(FALSE)
MessageBoxA
呼叫后。谢谢1201程序,我尝试按F12,但它将我带到选项卡:未加载符号:未加载ntdll.pdb。Break all也不会显示任何代码。请检查调用堆栈。一直往下走,直到你找到你的代码。查看调用中使用的变量,看看您是否能发现错误。@user4581301:但这里的情况只是消息框显示,目标是:尝试显示调用堆栈:)@123iamking,VS2017在工具->选项->调试:,下有一个名为“使用新异常助手”的新功能,也许它可以在调试过程中为您提供更多有用的信息。感谢您的回答:),debug DebugBreak()是一个很酷的技巧,但在我的情况下,有无数这样的块,我无法通过所有这些块添加DebugBreak()。除此之外,DebugBreak将显示一个绿色箭头,而不是黄色箭头。感谢您的回答,这也是一个很好的解决方案(+1)。但我正在等待微软开发一种新的调试方法(我希望如此),这种方法不需要更改代码,但在单击消息框上的ok(现在,当我单击BreakAll时,在某些情况下,它可以工作)后就可以断开。如果没有,则创建一个ShowMessage()函数,并将断点放在该函数中是一个解决方法。感谢您的回答,这也是一个很好的解决方案(+1)。通常情况下,如果我从开始到显示消息框代码都执行步骤调试(按F10),那么在我为消息框按Ok之后,调试将在显示消息框代码之后的代码处中断。我仍然在等待新的调试方法,它允许我不必从一开始就进行单步调试就可以做到这一点——我不知道这个新的异常帮助程序是否可以做到这一点(我使用的是VS 2015,所以我无法确认这一点)“从一开始就进行单步调试”是什么意思?如果你“F11步进”,它会从一开始就一步一步地调试你的应用程序吗?在旧版VS 2015中,它有一个异常设置,可以帮助您捕获异常,但它无法自行解决,您可以找到真正的原因并在您身边手动解决。从一开始就进行调试:我的意思是,不按F5运行调试,而是按F10运行调试,然后按F10直到达到[ShowMessage]代码,然后关闭消息框,然后Visual Studio将带您返回调试中离开的位置。@123iamking,VS2017确实有更多新功能,如此处的“调试和诊断”,但如果您必须使用VS2015,我建议您在此处提交一个功能请求:。谢谢Jack Zhai MSFT:)