Java を使用して GUI を実行し、C++ を使用して計算を実行し、JNI 経由で接続するプロジェクトがあります。アプリでデッドロックが発生し、3 時間以上経過するとそれが現れます。WinDBG を使ってデバッグしようと思いました。そこで、アプリをデバッグ対象としてアタッチし、正しいシンボルをロードして、コール スタックの表示を開始しました。問題は、取得しているコール スタックが、アプリの実行内容に対応していないように見えることです。
たとえば、約 10 個のワーカー スレッドがあり、すべてが次のように開かれています。
CreateThread(NULL, 0, &(work), this, 0, NULL);
しかし、windbg にはそのようなスレッドが 1 つしか表示されません。また、同じ呼び出しスタックが次のように見えるスレッドが少なくとも 20 個あります。
wow64cpu!CpupSyscallStub
wow64cpu!Thunk0ArgReloadState
wow64!RunCpuSimulation
wow64!Wow64LdrpInitialize
ntdll!LdrpInitializeProcess
ntdll! ?? ::FNODOBFM::`string'
ntdll!LdrInitializeThunk
それらは何ですか?
次に、スタック トレースが単一の関数で構成され、何度も繰り返されるスレッドがあります。
myModule!myFunc
myModule!myFunc
myModule!myFunc
myModule!myFunc
myModule!myFunc
myModule!myFunc
myModule!myFunc
myModule!myFunc
このmyFunc
関数は再帰的ではなく、独自のスレッドを開始しません。スタックがこのように見えるのはどうしてですか? 残りのスタック トレースはどこにありますか?
javaw モジュールで動作するスレッドはありません (少なくとも 1 つある必要があります - EDT)。
デバッガーでスレッドを正しく識別し、実際のスタック トレースを表示するにはどうすればよいですか?
また...デバッガで識別できるように、何らかの方法でスレッドにラベルを付けることは可能ですか?
詳細情報を編集:
ライセンスの目的で、Visual Studio を使用できません。
WinDBG バージョン: 6.12.0002.633 AMD64
Windows 7、6.1 ビルド 7601、SP1
Java 1.7.0_07
私はEclipse CDTを使用しており、最適化のために「デフォルト」、「最小サイズ」、「最大速度」のみを選択できます。私は「デフォルト」を使用しています。私のコンパイル コマンドは次のようになります。cl /c /EHs /MD /Zi
逆アセンブリを表示すると、元のソース コードではなく、モジュール内の関数のアセンブリ コードが表示されます。ただし、ソースの場所からソース ファイルを開きます。