1

何らかの理由で、サード パーティ ベンダーの dll クラスを参照するとすぐに統合デバッガーがエラーを引き起こします。これと同じコードは、スタンドアロンのリリースとしてビルドおよび実行されたときに実行されます。デバッグとリリースの 2 つのプロパティは、実際には変更していないため、同じである必要があります。両方のビルドのパスに lib ファイルを追加しました。私は単に持っています:

ClassNameFromDll blah;

ここに到達すると、次の例外が発生します。

MTGO SO Bot.exe の 0x78a3f623 (mfc90ud.dll) で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xf78e4568。

これは、afxtls.cpp の 252 行目で発生します。

これは MFC アプリですが、すべて win32 のイベントを発生させる非常に単純な GUI 以外の MFC は実際には使用していません。Visual Studio 2008 Express を使用しています。

4

3 に答える 3

2

VC9 インストールの atltls.cpp ファイルを見ると、クラッシュは次の場所で発生しています。

inline void* CThreadSlotData::GetThreadValue(int nSlot)
{
    EnterCriticalSection(&m_sect);
    ASSERT(nSlot != 0 && nSlot < m_nMax);
    ASSERT(m_pSlotData != NULL);
    ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED);   // <== crash
    // ...
}

したがって、リリース ビルドでクラッシュが発生しない理由は、そのビルドでは ASSERT() がノーオペレーションであるためです。私は ATL によるスレッド ローカル ストレージの使用に慣れていませんが、このアサーションは、まだ何も格納されていないスロットで何かが値を要求していることを示しています。

その TLS スロットの初期化があなたの責任なのか、サード パーティの DLL の責任なのかはわかりません。

初期化されていないスロットのリリース ビルドで NULL ポインターを返すように、いくつかの追加の保護があるように見えGetThreadValue()ます (これが保証されるかどうかはわかりませんが) - サード パーティの DLL がそれに依存していると思います動作 (つまり、NULL が返されるかどうかをチェックする) であるため、リリース ビルドでクラッシュは発生しません。ベンダーが CThreadSlotData クラスを間接的に使用している可能性があることに注意してください (スタック トレースがこれに関する手がかりになります)。

于 2009-02-05T16:41:12.460 に答える
1

魅力的なサイキックデバッグ

リリース モードで問題なく実行され、デバッグ モードでクラッシュするという事実は、ライブラリ自体を参照して、インポートするバージョンを決定するリンカ。

このアプリでは MFC を使用していない可能性がありますが、MFC アプリケーションとしてビルドしている場合は、必要かどうかに関係なく、すべての MFC を取得できます (つまり、MFC の依存関係の問題を解決して、アプリで MFC DLL を使用します)。

于 2009-02-05T15:45:19.637 に答える
0

投稿できるスタックトレースはありますか?役立つ情報があるかもしれません。

サードパーティのDLLがまだベンダーによって積極的にサポートされている場合、最初にすべきことは、ベンダーに送信して修正を依頼できる非常に単純なプログラムで同じ問題が発生する可能性があるかどうかを確認することです。

ベンダーが利用できないか、十分に対応していない場合:

サードパーティのDLLのソースがあり、独自のバージョンを簡単に作成できる場合は、おそらくこれをデバッグするための最良の方法があります(ベンダーにサポートを依頼することはできません)。ソースデバッグ可能なDLLを簡単に構築できない場合でも、コンストラクターのアセンブリ命令をトレースし、ソースをマップとして使用して、何が起こっているのかを理解するのに役立てることができます。

サードパーティのDLLのソースがない場合でも、コンストラクターをトレースして、何が問題になっているのClassNameFromDllかを把握するのが最善の方法だと思います。デバッグビルドとリリースビルドの命令パスを比較すると役立つ場合があります。

MFCソースはMSVCで配布されます(おそらくExpressバージョンではありませんが、他のすべてのバージョンではそう思います)。したがって、MFC DLLのコードに入ると、何が起こっているのかを理解するのに役立つソースが見つかるかもしれません。

于 2009-02-05T16:21:43.887 に答える