0

Application Verifier でデバッグを試みるまで、私のアプリは問題なく動作していました。その後、「最初のチャンスの例外...:無効なハンドルが指定されました」というメッセージが表示され始め、問題は Pantheios の「bailout.c」ファイルにあるようです。

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, 23/04/2012 10:48:17.496 am; デバッグ]:「いくつかのログ」

電話するときpantheios::log(pantheios::debug, "some logging");

次に、すべてのログがプロジェクトと同じフォルダー内の「救済」ファイルに書き込まれます。これは以前は機能していましたが、私の「To-do リスト」の大きな弾丸でした (ただし、他のものよりも少し下にあります)。

だから今私の質問は、どうすればこれを修正できますか? 私が見つけることができるすべてのチュートリアルに従いましたが、成功しませんでした。また、Ms Application Verifier を実行した後、アプリがこれを受け入れないことにしたのはなぜですか? 意味がありません。

4

1 に答える 1

2

最初のチャンスの例外は、例外がスローされたことのみを意味します。これは、プログラムにバグがあるという意味ではなく、例外がスローされていることをデバッガーが示しているだけなので、呼び出しチェーンに伝搬される前に調べることができます。例外が例外ハンドラー (ロギングなど) によってキャッチされた場合、アプリケーションは続行されます。それ以外の場合、デバッガーは、ハンドリングされない例外のためにアプリケーションが終了することを通知する 2 回目の例外通知を提供します。

初回例外通知を受け取りたくない場合は、デバッガーでオフにすることができます。 このリンクは、Application Verifier で例外処理をオフにする方法に役立つ場合があります。

この問題を回避するには、Application Verifier で例外テストをオフにします。これを行うには、次の手順を実行します。

1.Application Verifier を起動します。

2. [アプリケーション] で、テストする GDI+ プログラムをクリックします。

3. [テスト] で、[基本] を展開します。

4. [例外] チェック ボックスをオフにします。

5. テストする GDI+ プログラムを実行します。

また、アクセス違反が発生したときにデバッグ ツールでブレークポイントが発生しないように、デバッグ ツールを構成することもできます。

別の方法 (MSVS で例外通知をオフにする) は、"Debug->Exceptions..." を使用することです。

または、可能であれば、最初から例外がスローされないようにしてください。例外の性質 (ファイルが見つからないなど) を調べ、意図した操作を妨げている状態を修正する必要があります。

Application Verifier の性質/目的を考えると、後者のアプローチをお勧めします。AV は、以前は問題がなかったかもしれないが、後で問題を引き起こす可能性がある、何か間違ったことが起こっていることを示しています (環境、状況などによって)。

于 2012-04-27T15:33:58.180 に答える