|
コンパクトなクラスとなっていてとても使いやすくなっています。 コールスタックだけを見たい †StackWalker の派生クラスで不要なハンドラを空のメソッドでオーバーライドします。多分 OnSymInit?()、OnLoadModule?()、OnDbgHelpErr?() をつぶせば OK。 使用例 †例えばこんな派生クラス †class CurrentCallStack : public StackWalker { string m_String; public: CurrentCallStack( void ) : StackWalker( StackWalker::RetrieveNone ) { ShowCallstack(); } const string& GetString( void ) const { return m_String; } protected: virtual void OnOutput( LPCSTR szText ) { m_String += szText; StackWalker::OnOutput( szText ); } virtual void OnSymInit( LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName ) {} virtual void OnLoadModule( LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size, DWORD result, LPCSTR symType, LPCSTR pdbName, ULONGLONG fileVersion ) {} virtual void OnDbgHelpErr( LPCSTR szFuncName, DWORD gle, DWORD64 addr ) {} }; 普通に使う †CurrentCallStack ccs; cout << ccs.GetString(); 例外のお供に †class MyException : public std::exception { public: CurrentCallStack callstack; // ... }; なんかフルパス晒すと冗長だと思うなら †OnCallstackEntry?() をオーバーライドする。 virtual void OnCallstackEntry( CallstackEntryType eType, CallstackEntry &entry ) { lstrcpyn( entry.lineFileName, ::PathFindFileName(entry.lineFileName), sizeof( entry.lineFileName ) ); StackWalker::OnCallstackEntry( eType, entry ); } |