0

プレーンC(C ++、MFC、.NETなどなし)で記述されたプログラムをWIN32APIにデバッグしています。VS2005(Win 2K / XPで実行するため)とVS2010(Win7で実行するため)の両方でコンパイルする必要があります。顧客がかなり確実に複製できると思われるバグを複製できなかったので、方法を探しています。私のプログラムに「それ自体をデバッグ」させるために。変化しているすべてのキー値を監視していますが、私が本当に見たいのは、値が変化したときのスタックダンプです。ああ、お客様のマシンにコンパイラをインストールせずに(デバッグライブラリを使用して)「真の」デバッグビルドを実行することはできません。これはオプションではないため、これをリリースビルドに組み込む必要があります。

自分のスタックモニターに自分の関数のエントリ/終了呼び出しを追加する以外に、これを行う方法はありますか?特に、特定のメモリアドレスが予期せず変更された場合に、ハードウェアブレークポイントを設定できるようにしたいと思います(したがって、いくつかのEXPECTED変更場所の前後でハードウェアブレークポイントを無効/有効にできる必要があります)。これは可能ですか?Windowsプログラムでは?

可能であれば、数千行のコードを変更する必要のないものをお勧めします。そして、はい、開発ツールに関しては非常に恵まれていません。VisualStudioIDEのプロバージョンを持っていることは幸運だと思います。

--edit--以下に示す優れた回答に加えて、http://www.codereversing.com/blog/ ?p = 76で、独自のコードでハードウェアブレークポイントを使用することに関する情報を見つけました。他のプログラムをハッキングするという考えで書かれたと思いますが、私のニーズに合わせてうまくいくようで、予期しない場所が変数に書き込んだときにミニダンプを作成できます。特に私がそれを一般化することができれば、それはクールで本当に便利でしょう。回答ありがとうございます。今度は、このすべての新しい情報を使用して何を作成できるかを確認します。

4

3 に答える 3

3

MiniDumpWriteDump事後デバッグに使用できるダンプを作成する関数を使用できます。アプリケーションがクラッシュした場合は、でMiniDumpWriteDump設定された未処理の例外ハンドラから呼び出すことができますSetUnhandledExceptionFilter。あなたが話しているバグがクラッシュではないMiniDumpWriteDump場合、予期しない状況が検出されたときに、プログラムのどこからでも呼び出すことができます。クラッシュダンプと事後デバッグの詳細については、http://www.codeproject.com/Articles/1934/Post-Mortem-Debugging-Your-Application-with-Miniduをご覧ください。

この手法の主なアイデアは、クライアントサイトで生成されたミニダンプファイルが開発者に送信され、デバッグできることです。スレッド、スタック、および変数の情報が利用可能です(コードの最適化による明らかな制限があります)。

于 2013-03-19T13:20:19.790 に答える
2

dbghelp32.dllには、特定のスレッドのスタックトレースを生成するために使用できる多数のWin32関数があります。この例については、このコードを参照してください。

また、MSDNでStackWalk64()および関連する関数を検索することもできます。

有用な情報を得るには、リリースビルドのコンパイラでPDBファイルの生成をオンにする必要があります。顧客のコンピュータでPDBファイルがDLLと同じ場所にあるようにインストーラを設定すると、次の情報を取得できます。関数名などを使用してわかりやすいスタックトレースを実行します。これがないと、関数のDLL名と16進アドレスを取得するだけです。

ハードウェアブレークポイントを設定することがどれほど実用的かはわかりません。Win32デバッグAPIを使用するある種のデバッガーを作成できますが、それはおそらくその価値よりも厄介です。

于 2013-03-19T13:16:45.840 に答える
1

症状が再発したときに識別可能な例外を発生させるために限定されたインストルメンテーションを追加できる場合は、 Process Dumperを使用して、その例外の任意のインスタンスで完全なプロセスダンプを生成できます。

このツールを頻繁に引用していることがわかりました。これは、デバッグが難しい本番環境の問題に対する真の天の恵みですが、あまり知られていないようです。

于 2013-03-19T13:37:33.387 に答える