0

EVC++ 4.0 SP4 と MFC を使用して記述された Windows モバイル 4.0 アプリケーションがありますが、フィールドで時折ランダムにクラッシュします。例: Exception ox800000002 at 00112584. さまざまなエミュレーターやシミュレーターでは発生しないため、デバッガーを使用してトレースすることは非常に困難です。クラッシュが発生し、アドレスと例外の種類がスローされます。私が PDB を持っていることを考えると、このアドレスをソースまで追跡する方法はあります。モバイル 4 SDK をサポートしていないため、VC++ 8 を使用して再コンパイルすることはできません。

私の推測では、例外がソースにない可能性があるため、スタック トレースがなければあまり満足できないと思います。試してみる価値はあります。

編集 示唆されているように、プログラムの .MAP ファイルのコンテキストでアドレスを調べました。これにより、次のことがわかります

 Address         Publics by Value              Rva+Base     Lib:Object

 0001:00000000       ?GetUnduValue@@YANMM@Z     00011000 f   7Par.obj
'
'
'
 0001:001124b8       ?OnLButtonUp@CGXGridUserDragSelectRangeImp@@UAAHPAVCGXGridCore@@AAVCPoint@@AAI@Z 001234b8 f   gxseldrg.obj
 0001:001126d8       ?OnSelDragStart@CGXGridUserDragSelectRangeImp@@UAAHPAVCGXGridCore@@KK@Z 001236d8 f   gxseldrg.obj

これは、CGXGridUserDragSelectRangeImp::OnLButtonUp() 中にエラーが発生したことを示唆しています。これは、その時点でマウス/キーボード/画面ボタンが押されていないと思うので、少し奇妙に思えます。クラッシュが報告される前にスタックが断片化された可能性があり、時間を無駄にしています。アセンブラー出力を使用して再コンパイルして、特定の行に分離しようとしますが、あまり期待できません:(

マップ ファイルが 0001:xxxxxxxxx などのセグメント化されたアドレスをレポートし、クラッシュ レポートがセグメント化されていないアドレスをレポートするという事実は、クラッシュ アドレスからマップ アドレスを取得するために何らかの計算を実行する必要があることを意味しますか?

4

1 に答える 1

0

私が得た最も近い方法は、Visual Studio 8 で Windows Mobile 6 に対して再コンパイルし、デバッガーで実行することでした。これはそのようなクラッシュの 1 つをキャッチしましたが、理想的ではありません。

于 2010-05-14T06:01:43.743 に答える