6

ネイティブ C++ アプリケーションで実行時にコール スタックにアクセスしたいと考えています。私はIDEを使用していません。コール スタックを表示するにはどうすればよいですか?

更新: アプリケーション全体の多くのポイントから呼び出される関数があります。まれにクラッシュします。発信者の名前を取得してログに記録する方法を探していました。

4

6 に答える 6

3

StackWalk64をご覧ください。

.NETでこれを行うことに慣れている場合は、厄介な驚きがあります。

于 2008-09-24T10:57:02.127 に答える
1

未処理の例外フィルターを設定し、その中にミニダンプ ファイルを書き込むことを検討する必要があります。それほど複雑ではなく、十分に文書化されています。未処理の例外フィルターで一度に行うことは最小限にとどめてください (創造性を働かせれば、 すべてがうまくいかない可能性があることを読んでください)。

ただし、安全のために (未処理の例外フィルターが誤って上書きされる可能性があります)、コードを __try/__except ブロック内に配置し、フィルター関数内からミニダンプを書き込むことができます (注: 自動アンワインドを必要とするオブジェクトを__try/__except ブロックを使用した関数、それらがある場合は、それらを別の関数に入れることを検討してください):

long __stdcall myfilter(EXCEPTION_POINTERS *pexcept_info)
{
    mycreateminidump(pexcept_info);
    EXCEPTION_EXECUTE_HANDLER を返します。
}
void myfunc()
{
__try{
    //ロジックをここに
記述 } __except(myfilter(GetExceptionInformation())) {
    // 例外処理
}
}

その後、選択したデバッガーでダンプ ファイルを調べることができます。Visual Studio と Windows Debugging Tools パッケージのデバッガーの両方で、ミニダンプを処理できます。

于 2008-10-01T20:19:40.163 に答える
1

このページにはあなたが探している答えがあると思います。あなたはVisual Cと言ったので、Windowsを意味していると思います。

于 2008-09-24T12:20:03.910 に答える
1

クラッシュのコールスタックを取得したい場合、本当にやりたいことは事後デバッグです。実行中にアプリケーションのコールスタックを確認したい場合、これはSysInternals Process Explorerが提供できる多くの機能の 1 つです。

于 2008-10-21T10:31:17.487 に答える
0

積極的にデバッグしていない場合は、アプリを "クラッシュ" してミニダンプを生成できます (これは非侵襲的に実行でき、アプリの実行を継続できます)。IIRC DrWatson ではこれを実行できますが、MS サポートからの userdump がない場合はそうします。

次に、ダンプをwindbgにロードして、そこでコールスタック+変数などを確認できます。トレースを理解するには、アプリのシンボルが必要になります。

より単純なランタイム コード スタイルのトレースを探している場合は、すべてのメソッドでインスタンス化する単純なクラスをお勧めします。コンストラクターは、OutputDebugString を使用してメソッド名を書き込みます。WinDebug を使用して、プログラムの実行中にトレースを表示します。(グローバル変数やレジストリ値、またはグローバル Atom であっても、クラスになんらかの形式のコントロールを配置して、トレースを自由にオンまたはオフにできるようにします)。

于 2008-09-24T10:59:26.583 に答える
0

まれにクラッシュします。発信者の名前を取得してログに記録する方法を探していました。

クラッシュするとはどういう意味ですか?アクセス違反?ゼロで割る?正確には?カーネル モード コンポーネントと対話しますか?

AppVerifier をオンにします。それは多くのものを排除するはずです。

これを作成します:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\FileName.exe

そのキーの下に、新しい文字列 name を作成します: debugger value: c:\pathtowindbg\windbg.exe -gG -xe av

WOW で 32 ビット コードを実行している場合は、wow3264 ノードの下でこれを行う必要があります。

于 2008-10-01T20:39:35.903 に答える