2

ある操作を行った際に経験しているお客様によるプログラムを開発しました。これは常に同じ場所と同じデータで発生しているわけではなく、さらに、ローカルの開発マシンでもテスト仮想マシンでも発生していません (すべての開発機器がありません)。

これらの条件を考慮して、クラッシュの原因となっている関数を確認するために、MAP ([プロパティの構成] -> [リンカー] -> [デバッガー] でオプション /MAP を使用して有効化) でコンパイルすることにしました。

私が正しく理解していれば、プログラムがクラッシュしたときにオフセット エラーをチェックしてから、列 RVA+BASE の下の MAP を検索する必要があります。

     Address                         Publics by Value                                      Rva+Base       Lib:Object
 0001:00037af0       ?PersonalizzaPlancia@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00438af0 f   DlgGestioneDatiProgetto.obj
 0001:00038000       ?SalvaTemporanei@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00439000 f   DlgGestioneDatiProgetto.obj

実際、私のクラッシュはオフセットで発生します:

00038C90
だから私はそれがメソッドのどこかにあると考えるべきです:

MosaicoDialogs::CDlgGestioneDatiProgetto::PersonalizzaPlancia

しかし、これは絶対に可能ではないので、コンピューターが間違っている可能性はないと仮定すると、悪いことをしているのは私です。

誰かがMAPの正しい読み方を教えてくれませんか?

4

3 に答える 3

5

気にしないでください。代わりに、シンボルを有効にしてプロジェクトをビルドし、それらを pdb ファイルに取り除きます。

プログラムを少し変更して、未処理の例外ハンドラーを使用してクラッシュしたときにミニダンプを作成します。

新しくコンパイルされたプログラムを顧客に渡し、クラッシュしたときに MiniDumpWriteDump を呼び出します。

顧客にこの .dmp ファイルを送信するように依頼し、Visual Studio (または WinDbg) にロードするだけで、シンボルがプログラムに一致し、コードも一致します。コードの正確な行と関連する変数の一部を確認できるはずです。(VS を使用している場合、.dmp ファイルをロードすると、クラッシュの時点で「デバッグを開始」するため、右上隅に「デバッグを開始」するオプションが表示されます)

最初にローカルで試してみてください。プログラムのどこかに div by zero エラーを配置し、実行後にダンプをデバッグできるかどうかを確認してください。プログラムのビルドごとにまったく同じシンボル ファイルを保持する必要があることに注意してください。それらは完全に一致します。何も変更されていない場合でも、あるビルドのシンボル ファイルが別のビルドと一致することは期待できません。

この種のチュートリアルがあります。たとえば、必要なものを説明しているように見えるCodeProjectのチュートリアルです。

于 2014-06-03T16:04:19.803 に答える
2

事後分析のデバッグには、マップ ファイルを使用する必要のない代替手段があります。むしろ、いくつかのWER (Windows エラー報告) フラグを有効にしてクラッシュ ダンプ ファイルをトラップする単純なレジストリ スクリプトを作成する必要があります。まず、デバッグ シンボルを使用してアプリケーションをビルドします。次に、Collecting User-Mode Dumpsの手順に従います。基本的に、「LocalDumps」キーの下にサブキーを作成します。このサブキー"myapplication.exe" など、アプリケーションの名前にします。次に、「DumpCount」、「DumpType」、および「DumpFolder」のキー/値を作成します。ユーザーにレジストリ スクリプトを実行してもらいます。これにより、ダンプをローカルにトラップできます。次に、強制的にクラッシュさせてダンプ ファイルを収集するようユーザーに依頼します。その後、ユーザーはダンプ ファイルを送信して、以前に作成したシンボルを使用してデバッグできます。最後に、レジストリに追加したキー/値を削除するレジストリ スクリプトを作成する必要があります。

于 2014-06-04T12:32:59.793 に答える