2

アプリケーションが次のエラーでクラッシュします。

===========================================================
VERIFIER STOP 00000003: pid 0x2E54: multithreaded access in HEAP_NO_SERIALIZE heap
       00161000 : Heap handle
       00001444 : Thread owning heap lock
       00003188 : Current thread trying to acquire the heap lock
       00000000 :
===========================================================

アプリケーションの完全なページ ヒープを有効にしました。アプリケーションがランダムな場所でクラッシュします。多くの場合、クラッシュの場所はSTLの内部です。いずれの場合も、コールスタックが破損しているようです。

アプリケーションは、ライブラリと DLL ファイルのリストを使用します。すべての DLL ファイルとライブラリは、マルチスレッド DLL ライブラリ (コマンド ライン オプション/MD) を使用してビルドされます。

ライブラリの 1 つは、ヒープにメモリを割り当てるためにHeapAllocメソッドを使用しています。

クラッシュを特定するには、どのような手法を使用すればよいですか?

4

2 に答える 2

2

WinDbg でプログラムを実行することにより、既にそれを行っているようです。

エラー メッセージの興味深い部分を Google で簡単に検索すると、MSDN の記事Multithreaded Access In A HEAP_NO_SERIALIZE Heapが見つかりました。これは、ロードしているモジュールがシングル スレッド CRT に対してリンクされていることを示唆しています。

プロジェクトの各部分とすべてのプロジェクト設定を非常に注意深く調べて、すべてが実際に MD ライブラリを使用していることを確認します。何かが静的にリンクされている可能性があります。

于 2012-06-08T14:11:59.027 に答える
2

WinDbgを使用してアタッチし、シンボルを修正します。

.symfix;reload;

自動クラッシュ分析を実行します。

!analyze -v

すべてのスレッドのコール スタックを調べることができます。

~* kb;

Dependency Walkerを使用してモジュールの依存関係を確認し、シングル スレッド CRT を使用しているかどうかを確認できますが、John Dibling が示唆するように静的にリンクされているかどうかも確認します。

これは、プロジェクト設定で確認できます: Configuration Properties -> C/C++ -> Code Generation -> Check Runtime Library。「マルチスレッド DLL (/MD)」と表示されます。

于 2012-06-08T14:13:00.013 に答える