いまさらVC6でプロファイル

どうも、お久しぶりです。風間杜夫です。

いえ、そんなダウンタウン探偵組は関係ないです。

プロファイリングの話です。

#そういえば、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