5

だから私は、いくつかのデストラクタを呼び出さずにプロセスが終了するというこの奇妙な問題をデバッグしようとしています...

VS(2005)デバッガーで、「Break all」を押して、次のように表示されたときに、不思議なことに消えるプロセスのスレッドの呼び出しスタックを調べます。

SOのようなにおいhttp://img6.imageshack.us/img6/7628/95434880.jpg

これは間違いなく作成中のSOのように見えます。これは、スーツケースを最初に梱包せずにプロセスが幸せな場所に実行される理由を説明します。

問題は、VSデバッガーの呼び出しスタックには、イメージに表示されているものしか表示されないことです。

だから私の質問は:無限再帰呼び出しがどこから始まるのかをどうやって見つけることができますか?

Linuxでは、SIGSEGVハンドラーにコールバックをアタッチして、何が起こっているかについての詳細情報を取得できることをどこかで読みました。

Windowsで似たようなものはありますか?

4

5 に答える 5

3

アクセス違反が発生した場合の Windows の動作を制御するには( SIGSEGV-equivalent)、呼び出します SetErrorMode(パラメーター 0 を渡して、エラーが発生した場合に強制的にポップアップを表示し、デバッガーを使用してそれにアタッチできるようにします)。

ただし、既に取得したスタック トレースに基づいて、エラー時にデバッガーをアタッチしても追加情報が得られない場合があります。スタックが破損しているか、再帰の深さが VS で表示可能な最大フレーム数を超えています。後者の場合、プロセスのデフォルトのスタック サイズ小さく/Fして (プロジェクト プロパティでスイッチまたは同等のオプションを使用)、問題をより早く明らかにし、VSすべてのフレームを表示するようにすることができます。別の方法として、std::basic_filebuf<>::flush() にブレークポイントを設定し、破棄フェーズまでそれをウォークスルーする (または破棄フェーズの直前まで無効にする) こともできます。

于 2009-04-02T15:42:23.423 に答える
3

さて、あなたは問題がどのスレッドにあるかを知っています - それを最初からトレースして、雑草のどこに行くのかを確認するのは簡単なことかもしれません.

もう 1 つのオプションは、Debugging Tools for Windowsパッケージのデバッガーの 1 つを使用することです。VS デバッガーよりも多くの機能を表示できる可能性があります (おそらく)。ただし、一般的にはより複雑で使いにくい場合があります (実際には、そのためかもしれません)。 .

于 2009-04-02T16:02:58.337 に答える
1

これは一見、無限再帰のように見えますが、プロセスを終了する行の前にブレークポイントを配置してみてください。それは大丈夫ですか?もしそうなら、2 つのかなり簡単な方法があります。

前に進んで、どのデストラクタが呼び出され、いつ追いつかれるかを確認してください。または、関連するすべてのオブジェクト デストラクタに printf/OutputDebugString を配置することもできます (グローバルであるデストラクタのみがこれを必要とします)。メッセージがデストラクタが最初に行うことである場合、最後に表示されるメッセージは、物事をハングアップさせるデストラクタからのものです。

一方、最初に述べたブレークポイントに到達しない場合は、同様のことを行うことができますが、プログラムがまだ「何かをしている」ため、より面倒です。

于 2009-04-02T14:33:45.327 に答える
0

私はダン・ブレスラウに同意します。あなたのスタックは偽物です。ただし、単に適切なシンボルがないためかもしれません。WER 処理が開始されずにプログラムが単純に消える場合は、通常、メモリ不足の状態です。その可能性を調べに行きましたか?

于 2009-04-03T23:27:23.187 に答える
0

Windows にそのようなハンドラーが存在する可能性を否定するつもりはありませんが、聞いたことはありません。

あなたが示しているトレースバックは偽物かもしれないと思います。なんらかの破損がすでに発生した後にプロセスに侵入した場合、トレースバックは必ずしも有効ではありません。ただし、運が良ければ、スタック トレースの下部に、何が起こっているかについての手がかりが残っています。

Sleep()再帰に関与する可能性のあるソース内の選択された関数に呼び出しを入れてみてください。これにより、スタックが完全にオーバーフローする前に、プロセスに侵入する可能性が高くなります。

于 2009-04-02T14:04:24.447 に答える