Debug Interface Access SDKを用いて pdb ファイルにアクセスしてみます。
これもプロファイラ作成のための準備のため、です。たぶん簡易プロファイラ作成で一番手間なのはここの分野じゃないかなと思っています。
と思ったのですが、直接pdbファイルは参照しなくて良さそうでした。
すでにロードされているモジュールのハンドルがわかれば、そのモジュールのデバッグ情報はIDiaDataSource::loadDataForExe 関数でロードできるようです。 またアドレスから関数名にする作業ですが、IDiaSession::findSymbolByVA 関数を用いることで関数情報を取得でき、これから関数の名前を得るということを行います。この手順により、アドレスから関数名を取得ということが実現できます。
もうちょっと詳細な流れは以下のような感じになります。
- IDiaDataSourceインターフェースを取得
- 対象モジュールのデバッグ情報をロード
- その情報にアクセスするためのセッションを開く(IDiaSessionを取得)
- 得られたセッションに、現在ロードされているモジュールのベースアドレスを設定する
- セッションの IDiaSession::findSymbolByVA 関数を用いて関数情報を取得
- 得られた関数情報から、関数名を取得する
そのほかの注意点としては、元となっている関数アドレスはある関数の範囲であるという点です。戻りアドレスが元々プロファイルしたい関数の領域を指しているので、当然ですがアドレス=関数の先頭ではない点に注意が必要です。ですので、アドレスがどの関数の開始終了の間に含まれるか、ということを考慮しなくてはなりません。