2012-04-22 76 views
0

我的应用程序运行正常,直到我尝试使用Application Verifier进行调试。从那以后,我开始变得“​​第一次机会异常...:无效的句柄指定”等问题似乎在Pantheios的“bailout.c”文件:Pantheios的第一次机会例外

hFile = CreateFileA("logging-bailout.txt" 
       , GENERIC_WRITE 
       , 0 
       , NULL 
       , OPEN_ALWAYS 
       , 0 
       , NULL); <--- this is where it crashes, line 442 

和消息:

First-chance exception at 0x7769f8cd in myapp.exe: 0xC0000008: An invalid handle was specified. 


======================================= 
VERIFIER STOP 0000000000000300: pid 0x3814: Invalid handle exception for current stack trace. 

    00000000C0000008 : Exception code. 
    00000000111DE950 : Exception record. Use .exr to display it. 
    00000000111DE460 : Context record. Use .cxr to display it. 
    0000000000000000 : Not used. 


======================================= 
This verifier stop is continuable. 
After debugging it use `go' to continue. 

======================================= 

在控制台刚记录下我用Pantheios得到的异常之前,我并没有太在意太多。然而,现在,当应用程序崩溃的第一次登录使用Pantheios现在是我的时间来处理这个问题,但我不太确定如何。

设置时,我的Pantheios我按照本指南:http://www.codeproject.com/Articles/27119/Using-Callback-Back-ends-with-the-Pantheios-Loggin

在每一个文件我有记录我在源文件中的以下行:

#include <pantheios/pantheios.hpp> 
#include <pantheios/inserters/boolean.hpp> 
#include <pantheios/inserters/integer.hpp> 
#include <Shared/logs.h> 

logs.h包含:

#include <pantheios/implicit_link/core.h> 
#include <pantheios/implicit_link/fe.simple.h> 
#include <pantheios/implicit_link/be.WindowsConsole.h> 

在做任何记录之前,我也会打电话给pantheios::init();

我使用Visual Studio 2010和被包括在 “附加依赖” 下面的LIB-文件:

$(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 

然而,我所有的日志是这样的:

第一次机会myapp.exe中的0x750bb9bc处出现异常:Microsoft C++异常:stlsoft :: winstl_project :: windows_exception在内存位置0x1822bda0 ..

20120423-104817.497:未能将消息写入日志文件;给出的信息如下:[myapp.Qt.Framework.13424,2012年4月23日10:48:17.496 a.m .;调试]:致电pantheios::log(pantheios::debug, "some logging");

时,那么,“一些日志”

,我的所有日​​志记录被写入了“救市”的文件在同一文件夹中的项目。这工作之前,但它是我的“待办事项列表”上的一个重大的子弹(但比其他事情更深入一点)。

所以现在我的问题是,我该如何解决这个问题?跟着我找到的每一个教程,但没有成功。为什么我的应用程序在运行Ms应用程序验证程序后决定不再接受此操作?没有意义。

回答

2

First chance exceptions仅表示抛出了异常。这并不意味着你的程序中存在一个bug,只是调试器向你显示了一个异常正在抛出,所以你有机会在它传播到调用链之前检查它。如果异常被异常处理程序捕获(例如,用于日志记录),则应用程序将继续执行,否则调试程序将为您提供第二次异常通知,通知您应用程序将由于未处理的异常而退出。

如果您不想接收第一次机会的异常通知,可以在调试器中关闭它。 This link可能有助于了解如何关闭Application Verifier中的异常处理。

要解决此问题,请关闭Application Verifier中的异常测试。要这样做,请按照下列步骤操作:

1.启动应用程序验证程序。

2.在应用程序下,单击要测试的GDI +程序。

3.在测试下展开基础知识。

4.单击以清除例外复选框。

5.运行您要测试的GDI +程序。

您还可以配置调试工具以确保在发生访问冲突时在调试工具中不会遇到断点。

替代(关闭在MSVS异常通知)是通过“调试 - >例外...”

或者,如果可能的话,确保异常不会在第一时间抛出。您需要检查异常的性质(例如找不到文件)并修复阻止预期操作的条件。

考虑到应用程序验证程序的性质/目的,我建议采用后一种方法:AV正在告诉您某些不正确的事情可能以前已经发生,但以后可能会导致问题(取决于环境,等等)

+0

是的,我转过身,所以现在它不再崩溃了。然而,我不能在我的日志记录中显示这条消息,因为这使得它很难阅读。我仍然无法弄清楚如何让它消失。 – chikuba 2012-04-29 22:23:16

+0

第一次机会的异常消息如何写入您的自定义日志中?如果您捕获所有异常并记录它们,则可以明确指出哪些异常会被抛出并忽略它。理想的解决方案仍然是修复导致异常的条件,当首先调用'CreateFileA' – Attila 2012-04-30 00:03:44

+0

不记录异常,但是“20120327-112911.994:未能将消息写入日志文件;给出的消息如下:”in消息的开始。 – chikuba 2012-04-30 00:56:32

相关问题