2

Windows 8 ユーザー マシンでのみ発生する Qt でのクラッシュを追跡するために、クラッシュ ダンプのデバッグに使用するローカル シンボル サーバーをセットアップしました。

最初に、次のフラグを設定して完全なビルドを行いました。

QMAKE_CFLAGS_RELEASE += -Zi
QMAKE_CXXFLAGS_RELEASE += -Zi
QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF

そして、Windows インストーラーと VS 展開プロジェクトを使用してインストーラーを構築しました。次に、次の symstore.exe コマンドを実行しました。

C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64>symstore.exe add /r /f C:\builddir\*.* /s "C:\Users\Sam\symbols" /t "Application" /v "rev xxxx" /c "test add"

これにより、適切な dll、exe、および pdb フォルダーが 内に作成されましたC:\Users\Sam\symbols

次に、ユーザー マシンにインストールし、Process Explorer を使用してミニダンプ ファイルを生成しました。ダンプを Visual Studio に読み込みC:\Users\Sam\symbols、シンボル ファイルの場所に追加しようとしましたが、バイナリに一致するシンボルが見つかりませんでした。

次に、WinDbg64 (これは 64 ビット アプリケーションです) にロードしようとしました。!sym noisyでシンボルパスを設定し、.symfix C:\Users\Sam\symbolsでリロードしまし.reload /fた。これも成功せず、ロードされたシンボルのみをエクスポートしました。例えば:

QtGui4  No data is available : SRV*C:\Users\Sam\symbols*http://msdl.microsoft.com/download/symbols
    The SYMSRV client failed validating the GUID for the module, or the
    module does not have the debug header information.

これはすべてのモジュールで発生しますが、Qt コンポーネントは通常のビルドの一部としてビルドされず、シンボル フォルダーを pdb ファイルを直接含む lib フォルダーに設定しても役に立たないため、Qt コンポーネントではまったく期待できません。

ChkMatch.exe次に、シンボル ストア内の実行可能ファイルと pdb ファイルに対して実行を試みました。実行可能ファイルの署名は、pdb が含まれているフォルダーと一致し、それらが一致する必要があることを示していましたが、次のエラーが発生しました。

Debug information file:
Format: PDB 7.00
Error: PDB header - too many pages in root stream.

ChkMatch.exeのため、インストールされた実行可能ファイルに対して再度実行しましたが、同じ署名と同じエラーが発生しました。

編集:symopt+0x40署名GUIDをあまり詳しくチェックせずに、とにかくWinDbgにpdbを使用させる 設定を試みました。ただし、まだ何もロードされていません。余分な出力:

SYMSRV:  C:\Users\Sam\symbols\QtGui4.dll\5202030497e000\QtGui4.dll not found
...
SYMSRV:  C:\Users\Sam\symbols\QtGui4.dbg\5202030497e000\QtGui4.dbg not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/QtGui4.dbg/5202030497e000/QtGui4.dbg not found
DBGHELP: .\QtGui4.dbg - file not found
DBGHELP: .\dll\QtGui4.dbg - path not found
DBGHELP: .\symbols\dll\QtGui4.dbg - path not found
DBGHELP: QtGui4.dll missing debug info.  Searching for pdb anyway
DBGHELP: Can't use symbol server for QtGui4.pdb - no header information available
DBGHELP: QtGui4.pdb - file not found
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for QtGui4.dll - 
DBGHELP: QtGui4 - export symbols

のフォルダーにC:\Users\Sam\symbols\QtGui4.dllは名前4AA92D1B712000があり、正しい dll であるべきものが含まれています。

4

2 に答える 2

1

私は最終的にこれを自分で解決することができました。まず、上記の手順を使用して、シンボル ストアを最初から削除して再作成する必要がありました。symstore.exe異なるフォルダーで同じバージョン番号を使用して 2 回実行することで、最初はストアを台無しにしたに違いないと思います。

これを実行すると、クラッシュ ダンプをロードして Qt ライブラリのシンボルを確認できましたが、最大で約 20 フレームしかなく、他のモジュールはロードされませんでした。次に、このスタックをコピーしたかったのですが、スタックウィンドウからコピーできなかったため、スタックを印刷するコマンドがWinDbg見つかりました。kこれは「あはは!」でした。これは、kコマンドがスタック ウィンドウよりも多くの情報を出力し、スタック オーバーフローが発生したことを明らかにしたためです。k 0xFFFFスタックの深さを印刷し、スタック全体を印刷するために、追加のパラメーターを渡すことができることがわかりました。

于 2014-09-01T12:51:38.367 に答える