ソースコードもシンボルもなしにデバッグするのは困難です。取るべきアプローチは、何を観察できるか、どのような仮定を立てられるかによって大きく異なります。以下は、あなたの状況にとって妥当に聞こえます。
64 ビットのファイル アクセスを 32 ビット バージョンと比較します。
64ビット版でも動作するので、ファイルアクセスの違いはどうなのか見てみましょう。Process Monitor ログを CSV にエクスポートし、ファイル アクセスを分析するツールを作成できます。あなたの分析ツールはおそらく
- オフセットが異なる複数のファイル読み取りアクセスを、ファイル全体に対する単一のファイル アクセスにまとめます。
- 順序はそれほど重要ではないように思われるため、読み取り順序は無視してください。
- 最初は DLL を無視する
たぶん、Excel自体でそれを行うことさえできます。
ファイル アクセス コールのキャプチャ
まず、Process Monitor を使用することは、すでに良いアプローチだと思います。アプリケーションについて何も知らなくても、アプリケーションが何をしているかを知ることができるので、それが私の最初の選択です。
もちろん、問題のファイルのリストを絞り込むことは困難です。必要に応じて、たとえばバッチ ファイルを使用してそれらすべてを確認し、ファイルを開いたアプリケーションを見つけるのに役立つコマンド ライン ツールを見つける必要があります。この場合、SysInternals Handleを見てください。これはコマンド ライン ユーティリティであり、ファイル名を付けることができます。基本的に、これは Process Explorer のコマンド ライン バージョンです (以下を参照)。
ファイルの読み取りとファイルの書き込みは通常、API 呼び出しを介して行われるため、API モニターも別のオプションです。疑わしいすべてのファイル アクセス メソッド (ReadFile、ReadFileEx、LockFile、LockFileEx、WriteFile、WriteFileEx、...) をフィルター処理します。
これは、WinDbg でブレークポイントを設定することによっても実現できますが、ブレークポイントを頻繁にヒットする可能性があるため、それらの処理にはおそらく自動化が必要です。コマンドにはコマンド文字列を指定できますbp
。
幸運になる
フォーマット文字列の引数として使用することを意図したファイル名が%s
メモリのどこかにある可能性があります。
- アプリケーションがメッセージを表示した時点でクラッシュ ダンプを取得します。
- SysInternals Stringsユーティリティを使用して、ダンプのすべての文字列をダンプします。
C:\
などの出力をコマンドにD:\
パイプして直接フィルタリングするかfind
、後で分析するためにテキスト ファイルにリダイレクトします。
これでも多くのファイルが残るため、原因を見つけることは以前のアプローチよりもはるかに簡単ではありません. ここでも、他のツールを使用してリストを絞り込みますhandle
。
- アプリケーションがメッセージを表示した時点でクラッシュ ダンプを取得します。
- WinDbg でダンプを開きます
- スタック上で見つけたいくつかのアドレスの文字列をダンプします。NTFS のファイル名は Unicode であるため、
du <address>
ここでは問題なく動作するはずです。
これには間違いなく、適切なポインターを見つける場所など、内部的なものに関するより多くの知識が必要です。
初回例外の分析
アプリケーションが例外に依存している場合は、最初の例外を確認することで洞察を得ることができます。ただし、アプリケーションが適切な前提条件チェックを行うと、例外が少なくなるため、有用なものを取得する可能性が低くなります。
状況がうまく再現できれば、
- Image File Execution Optionsを使用して、WinDbg をそのプロセスのデバッガーとして設定します。
- でログファイルを開く
.logopen /t /u c:\firstchanceexceptions.log
- を使用してすべての例外をダンプし
sxe -c ".exr -1;k;g" *
ます。そのg
コマンドの はすぐに続行されるため、アプリケーションは (できれば) タイムアウトにならないようにします。
- で実行を続ける
g
- アプリケーションが終了したら、ログファイルを閉じます
.logclose
- 興味深い例外/興味深いコール スタックのログ ファイルを確認します。
- エラーを再現しますが、今回は興味深い例外で停止します
- ファイル名が見つかるかどうか、メソッドのパラメーターとメモリを調べます (ここでも を使用します
du <address>
) 。
メッセージ ボックスに属するアプリケーションを見つける
メッセージのタイトルが間違っているなどの理由で、エラー メッセージが表示されているアプリケーションがわからない場合は、次のようにします。
SysInternals Process Explorerをダウンロードして実行します。
ツールバーから十字線をウィンドウにドラッグします。
Process Explorer は、ウィンドウを所有する実行可能ファイルを強調表示するようになりました
ファイル名が印刷されている場合のロックアプリケーションの検索
ダイアログに「%s」だけでなくファイル名が表示される場合:
Process Explorer も使用する
検索/検索ハンドルまたは DLL を使用するか、Ctrl+キーを押しますF
ファイル名またはファイル名の一部を入力します