C++ 潘提奥斯的第一次机会例外
我的应用程序运行良好,直到我尝试使用应用程序验证程序进行调试。之后,我开始得到“第一次机会异常…:指定了无效句柄”,问题似乎出现在Pantheios中的“bailout.c”文件中:C++ 潘提奥斯的第一次机会例外,c++,visual-studio-2010,pantheios,C++,Visual Studio 2010,Pantheios,我的应用程序运行良好,直到我尝试使用应用程序验证程序进行调试。之后,我开始得到“第一次机会异常…:指定了无效句柄”,问题似乎出现在Pantheios中的“bailout.c”文件中: hFile = CreateFileA("logging-bailout.txt" , GENERIC_WRITE , 0 , NULL , OPEN_
hFile = CreateFileA("logging-bailout.txt"
, GENERIC_WRITE
, 0
, NULL
, OPEN_ALWAYS
, 0
, NULL); <--- this is where it crashes, line 442
在控制台记录Pantheios的异常之前,我并不太在意。然而,现在当应用程序在第一次使用Pantheios登录时崩溃时,我该处理这个问题了,但我不太确定如何处理
我在设置Pantheios时遵循了以下指南:
在我记录的每个文件中,源文件中都有以下行:
#include <pantheios/pantheios.hpp>
#include <pantheios/inserters/boolean.hpp>
#include <pantheios/inserters/integer.hpp>
#include <Shared/logs.h>
但是,我的所有日志记录如下所示:
< P>第一个异常例外:MyApp.EXE中的0x750BB9B:微软C++异常:STLSOFT::WistSTLYPosi::WistOsSUB异常在内存位置0x1822BDA0..…
20120423-104817.497:将消息写入日志文件失败;给出的消息如下:[myapp.Qt.Framework.1342423/04/2012 10:48:17.496上午;调试]:“一些日志记录”
调用pantheios::log(pantheios::debug,“somelogging”)代码>
然后,我的所有日志记录都会写入项目所在文件夹中的“紧急援助”文件。这在以前是可行的,但在我的“待办事项清单”上却是一个大问题(但比其他事情要慢一点)
现在我的问题是,我该如何解决这个问题?我遵循了我能找到的每一个教程,但没有成功。为什么在运行Ms应用程序验证程序后,我的应用程序决定不再接受此选项?毫无意义。仅表示引发了异常。这并不意味着您的程序中有bug,只是调试器向您显示正在抛出异常,因此您有机会在异常向调用链传播之前对其进行检查。如果异常处理程序捕捉到异常(例如用于日志记录),则应用程序将继续,否则调试器将再次发出异常通知,通知您由于未处理的异常应用程序将退出
如果不希望接收第一次机会异常通知,可以在调试器中关闭它。可以帮助您关闭应用程序验证程序中的异常处理
要解决此问题,请关闭应用程序验证程序中的异常测试。要执行此操作,请执行以下步骤:
1.启动应用程序验证程序
2.在应用程序下,单击要测试的GDI+程序
3.在测试下,展开“基础”
4.单击以清除例外复选框
5.运行要测试的GDI+程序
您还可以配置调试工具,以确保在发生访问冲突时,调试工具中不会出现断点
替代方法(关闭MSV中的异常通知)是通过“调试->异常…”
或者,如果可能的话,确保一开始不会抛出异常。您需要检查异常的性质(例如,未找到文件),并修复阻止预期操作的条件
考虑到应用程序验证程序的性质/用途,我建议采用后一种方法:AV告诉您发生了一些不正确的事情,以前可能还可以,但以后可能会导致问题(取决于环境、情况等)是的,我将其关闭,因此现在它不再崩溃。然而,我不能在我的日志中有这条消息,因为它使我很难阅读。我仍然不知道如何让它消失..如何在自定义日志中写入第一次出现的异常消息?如果您正在捕获所有异常并记录它们,那么您可以确定具体抛出了什么异常并忽略它。理想的解决方案仍然是在首先调用CreateFileA
时修复导致异常的条件,不记录异常,但“20120327-112911.994:未能将消息写入日志文件;给定消息如下:”是的,这将是一个理想的解决方案,但由于我不知道如何解决这个问题(只是按照教程来达到我的目的),我希望有人可能有同样的问题并解决了:)这可能实际上是AppVerifier中的一个bug:有类似的问题,尽管还没有答案,但“异常分析”部分声明句柄的空值被视为无效。OTOH声明传递句柄的空值是可以的。作为一种解决方法,在AppVer下测试时,将紧急救援日志文件视为常规文件。
#include <pantheios/pantheios.hpp>
#include <pantheios/inserters/boolean.hpp>
#include <pantheios/inserters/integer.hpp>
#include <Shared/logs.h>
#include <pantheios/implicit_link/core.h>
#include <pantheios/implicit_link/fe.simple.h>
#include <pantheios/implicit_link/be.WindowsConsole.h>
$(PANTHEIOS_ROOT)\lib\pantheios.1.core.vc10.mt.debug.lib
$(PANTHEIOS_ROOT)\lib\pantheios.1.be.WindowsConsole.vc10.mt.debug.lib
$(PANTHEIOS_ROOT)\lib\pantheios.1.fe.simple.vc10.mt.debug.lib
$(PANTHEIOS_ROOT)\lib\pantheios.1.util.vc10.mt.debug.lib