2

まず第一に、私の質問を見て助けてくれてありがとう。ここの多くの質問者がほとんどまたはまったく感謝を示さないことに気づきましたが、私はここの助けとコミュニティに心から感謝しています:)

ソースコードがないアプリケーション(ビデオゲーム)用にC ++プラグイン(数百のソースファイルで妥協)を作成しました。つまり、プラグインのソースコードしかなく、ゲームはありません。さて、私のプラグインの何千行ものどこかで、何かがゲームエンジンをスローさせ(おそらくアクセス違反)、どこにあるのかわかりません。デバッガーが破損するまでに、スタックが破損し、取得するのはソースがないDLLの16進アドレスだけです(ただし、例外は確実にDLLで発生します)。私はすべてを試しました...例外が発生する場所を見つけることができないようです。デバッガーが「メモリ再配置」関数(プラグインでは使用したことがない)を指す場合もあれば、エンジンのGameFrame()を指す場合もあります。

私は実質的にすべてを試しました...WinDbgやMicrosoftApplicationVerifierなどの他のデバッガーの使用方法を見つけるために何時間もグーグルで検索しました。デバッガーが指している場所のいずれか、または両方をコメントアウトしようとしましたが、それでもクラッシュします。OUTPUT("The name of the last executed function is: %s", __FUNCTION__)最後の関数を丹念にキャッチしたいので、アプリケーションのすべての関数に挿入しましたが、どのような種類のI / Oでも、何らかの理由で例外が発生しないようです...そして10分間のデバッグと、最後に実行されたランダムなクラッシュが発生します働き。

このアクセス違反がどこで発生しているのか、または一時オブジェクトが削除されてこれらの不正なポインターが発生しているのかはわかりませんが(使用する前にすべてのポインターをチェックします)、くそー、ここで限界に達しています。

では、不可能なことをどのようにデバッグするのでしょうか...安っぽいデバッガーの呼び出しスタックでランダムにクラッシュするのでしょうか?あなたの患者と親切な助けを事前に感謝します!

4

2 に答える 2

1

私の提案: 別のデバッガー (MS 以外) を試してみてください。私の経験: ソース コードと完全なデバッグ シンボルを持っているプログラムがスタックを破損しています。VS も WinDbg も役に立ちませんが、Ollydbg は非文字列 var に値「r for pattern.」を付けてコメントしているため、この var に文字列バッファを上書きしていました。 . また、Ollydbg には (dbghelp.dll を使用しない) 難しい方法でスタックをウォークするオプションがあります。

于 2012-12-12T16:05:51.813 に答える
0

私の経験から言うと、「予防は治療に勝る」という古い格言は非常に当てはまります。バグが現れてから後で解決するよりも、適切なソフトウェア開発プラクティス (単体テスト、リグレッション、コード レビューなど) に従って、バグの侵入を防ぐのが最善です。

もちろん、現実の世界は完璧ではなく、バグが発生します。メモリの破損をデバッグするには、valgrind などの優れたツールがいくつかあります。これは、少なくとも問題のあるセクションを絞り込んで、詳しく調べることができます。複雑なプログラムをデバッグするのは簡単ではありません。デバッガーが異常終了した場合は、多くの永続性が必要になります。私が便利だと思うテクニックの 1 つは、特定のモジュールを選択的に有効または無効にして、問題のあるモジュールを絞り込むことです。

一部のモジュールをアンロードするために「参照透過性」を使用する必要がある場合があります。簡素化された例を示すには、次のことを考慮してください。

int foo = factorial(3);

このコードに問題があると思われる場合 (コール スタックが表示される前にデバッガーがクラッシュする場合)、このコードを削除してみて、問題が解決しないかどうかを確認する必要があります。ただし、foo後で使用する可能性があるため、簡単に削除することはできません。代わりに、それを置き換えてint foo = 6;続行できます。

もう 1 つの重要なポイントは、コードが実行内容を記録し続けるトレース ファイルを常に維持することです。プログラムがクラッシュした場合、多くの場合、トレース ファイルが問題の絞り込みに役立ちます。もちろん、パフォーマンスのボトルネックが発生しないように、デフォルトでトレースを無効にします。

于 2012-12-12T01:51:23.133 に答える