ネイティブ C++ アプリケーションで実行時にコール スタックにアクセスしたいと考えています。私はIDEを使用していません。コール スタックを表示するにはどうすればよいですか?
更新: アプリケーション全体の多くのポイントから呼び出される関数があります。まれにクラッシュします。発信者の名前を取得してログに記録する方法を探していました。
ネイティブ C++ アプリケーションで実行時にコール スタックにアクセスしたいと考えています。私はIDEを使用していません。コール スタックを表示するにはどうすればよいですか?
更新: アプリケーション全体の多くのポイントから呼び出される関数があります。まれにクラッシュします。発信者の名前を取得してログに記録する方法を探していました。
StackWalk64をご覧ください。
.NETでこれを行うことに慣れている場合は、厄介な驚きがあります。
未処理の例外フィルターを設定し、その中にミニダンプ ファイルを書き込むことを検討する必要があります。それほど複雑ではなく、十分に文書化されています。未処理の例外フィルターで一度に行うことは最小限にとどめてください (創造性を働かせれば、 すべてがうまくいかない可能性があることを読んでください)。
ただし、安全のために (未処理の例外フィルターが誤って上書きされる可能性があります)、コードを __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 パッケージのデバッガーの両方で、ミニダンプを処理できます。
このページにはあなたが探している答えがあると思います。あなたはVisual Cと言ったので、Windowsを意味していると思います。
クラッシュのコールスタックを取得したい場合、本当にやりたいことは事後デバッグです。実行中にアプリケーションのコールスタックを確認したい場合、これはSysInternals Process Explorerが提供できる多くの機能の 1 つです。
積極的にデバッグしていない場合は、アプリを "クラッシュ" してミニダンプを生成できます (これは非侵襲的に実行でき、アプリの実行を継続できます)。IIRC DrWatson ではこれを実行できますが、MS サポートからの userdump がない場合はそうします。
次に、ダンプをwindbgにロードして、そこでコールスタック+変数などを確認できます。トレースを理解するには、アプリのシンボルが必要になります。
より単純なランタイム コード スタイルのトレースを探している場合は、すべてのメソッドでインスタンス化する単純なクラスをお勧めします。コンストラクターは、OutputDebugString を使用してメソッド名を書き込みます。WinDebug を使用して、プログラムの実行中にトレースを表示します。(グローバル変数やレジストリ値、またはグローバル Atom であっても、クラスになんらかの形式のコントロールを配置して、トレースを自由にオンまたはオフにできるようにします)。
まれにクラッシュします。発信者の名前を取得してログに記録する方法を探していました。
クラッシュするとはどういう意味ですか?アクセス違反?ゼロで割る?正確には?カーネル モード コンポーネントと対話しますか?
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 ノードの下でこれを行う必要があります。