どうも、お久しぶりです。風間杜夫です。
いえ、そんなダウンタウン探偵組は関係ないです。
プロファイリングの話です。
#そういえば、X-FILES2が今秋公開ですね!
VC6のプロファイラほど、使われないものはありません。
日本語版の致命的なバグ(プロジェクトの設定で、プロファイルを有効にしようとすると、インクリメンタルビルドが有効になって、プロファイル設定が有効にならない)が第一の原因でしょうね。
ていうか、SP3のころには知れ渡っていたこのバグがどうして最後のSP6になっても修正されなかったのかは、マイクソソフト7フシギのひとつと言っても良いかもしれません。
さて、カスタムバッチを使えば、関数呼び出しのトレースも記録することができます。
こんな感じ。深い深いMFCの森も簡単にツリーに書き起こせます。カバレッジ込みで。
| 関数 関数+チャイルド ヒット
関数および | 時間 % 時間 % カウント
CProfileTestDlg::GetMessageMap(void) (profiletestdlg.obj) | 0.000 0.0 0.000 0.0 245
CProfileTestApp::InitInstance(void) (profiletest.obj) | -13.240 0.0 -13.240 0.0 206
CProfileTestDlg::OnSysCommand(unsigned int,long) (profiletes*| -2.265 0.0 -2.265 0.0 37
CProfileTestApp::InitInstance(void) (profiletest.obj) | -2.265 0.0 -2.265 0.0 37
CProfileTestDlg::OnInitDialog(void) (profiletestdlg.obj) | -0.142 0.0 -0.142 0.0 2
CProfileTestApp::InitInstance(void) (profiletest.obj) | -0.142 0.0 -0.142 0.0 2
CProfileTestDlg::DoDataExchange(class CDataExchange *) (profil*| 0.000 0.0 0.000 0.0 2
CProfileTestApp::InitInstance(void) (profiletest.obj) | -0.062 0.0 -0.062 0.0 1
CProfileTestDlg::OnInitDialog(void) (profiletestdlg.obj) | -0.065 0.0 -0.065 0.0 1
CProfileTestApp::InitInstance(void) (profiletest.obj) | -0.065 0.0 -0.065 0.0 1
バッチは、ヘルプのサンプルを基にして、
prepコマンドに/FTの代わりに
/AT /STACK 10
と渡せばOK。
さらにplistの/TRACEを効かせる方法も発掘中。
ちなみに、prepコマンドはプロファイル有効でリンクされたexeやdllをprofile.dll依存する形に変換します。
あとはいくつかの環境変数を設定しておけば、VCすらなくてもプロファイル結果が手に入ります。
具体的な手順は、例えばイカのKBを見るといいです。
[HOWTO] ISAPI DLL のプロファイル
http://support.microsoft.com/kb/195768/ja
VC6のtips(ありがたいページ)
http://greenhand.web.infoseek.co.jp/school/tips/profile/index-j.html