2009-06-03 5 views
0

Delphi COMコンポーネントがISAPI Webアプリケーションから呼び出されています。 COMコンポーネントは、MessageBox()を表示しようとしているため、アプリケーションをハングしています。ユーザコードにはMessageBox()呼び出しがありませんので、おそらく例外ハンドラコードでDelphiランタイムソースに配置する必要があります。IIS Debug Diagnosticsレポートを使用してDelphi COMコンポーネントのソースファイル行を検索する方法

モジュール名+オフセットアドレスを問題のコードとして示すIISデバッグ診断レポートがあります。

モジュール用の.MAPファイルがあり、MAP2DBGを使用して.dbgファイルも作成しています。

私たちの質問は、.MAPまたは.DBGファイルを使用して、オフセットアドレスを含むIISデバッグダイアグハングレポートを使用して、ソースコード行をどのように見つけるかです。

私たちはWinDbgを使用しようとしましたが、ソース行を見つけるために何をする必要があるか分かりませんでした。

答えて

3

最初に、プロセスがCOMモジュールをIISプロセスにロードした場所のベースアドレスを見つける必要があります。これは、IISデバッグログで明白です。このBASEを呼び出します。

次に、MAPoffset = offset - BASE - $ 1000を計算すると、Delphi MAPファイルで検索できるアドレスがあります。

MAPファイル(行番号のマッピングを取得するために詳述する必要があります)には、「linenumber segment:offset」のレコードをリストする各ソースモジュールのセクションがあります。次に、MAPoffsetがオフセットまたは2つの行番号オフセットの間に等しいかどうかを確認します。これは、行が違反行になる方向を与えるはずです。

通常、セグメントは生成されたコードを含むテキストセグメントを示します(MAPファイルの先頭にセグメントマップがあります)。

希望すると便利です。

+0

+1すばらしい答えです。マップファイルはバグを発見する鍵であり、マップファイルを理解することは、展開後にポップアップする厄介なAVエラーを見つける秘訣です。このような理由から、ソースにタグ付きのソース管理のMAPファイルをリリースに保存する傾向があります。 – skamradt

+0

ダンプファイルに対するIISデバッグレポートは、問題のアドレスとしてModuleName + 4974を示します。 WinDbgを使用してダンプファイルをロードすると、モジュールの開始は064F0000になります。 だから064F4974 - 064F000 = 4974です。4974 - 1000は3974です。私は.mapファイルにその番号の近くにも何も表示されません。私は何が欠けていますか? –

+0

マップファイルには、「セグメントの詳細リスト」の一番上のセクションがあります。このセクションでは、最初の行は、私のマップファイルで次のようになります。 0001:00000000 00006B49 C = CODE S = .text G =(なし)M =システムACBP = A9 これはタイプ1(。テキスト)は、0から始まり$ 6B49バイトを実行します。これがあなたのマップファイルであれば、あなたのモジュールは 'System'モジュールであると言えます。さて、あなたがあなたのモジュールを特定したので、そのモジュールのためのこのようなセクションがあるはずです: "システム(GETMEM.INC)セグメント.text"の行番号。 –

関連する問題