Tag: WinAPI C++ Debuggin

コンパクトなクラスとなっていてとても使いやすくなっています。

コールスタックだけを見たい

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 );
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-01-26 (月) 07:41:30 (587d)