現在、VC++6.0 SP5で作成された大規模なアプリケーションのデバックをしております
VCの機能であるクラスのある関数を呼び出している箇所を検索する方法はないでしょうか?
ファイルから検索で検索文字列を指定する場合には、同じ名前の関数もピックアップされます
すると、数千件単位で列挙されるので追いきれません
コンパイラ自信は利用先を知っているはず(知らなければコンパイルできない)なので、
VCにそういった機能はないでしょうか
関数ポインタを使っての関数呼び出しもわかるとさらにうれしいです
一応、調べたい関数の名前をかえてコンパイルをかけるって方法があることはあるのです
が・・・
仮想関数はいかがいたしましょう。
実行時に呼び先が決定するので、静的に見つけ出すのはムリではないかと。
>仮想関数はいかがいたしましょう
その仮想関数が呼び出される可能性のある箇所の特定はできませんか?
aを継承したx,yというクラスがあった場合に
各クラスが、virtual fun()という関数をもっているとしたら、x::fun()の呼び出し先と
して、a::fun()、x::fun()、y::fun()のいずれかを呼び出す可能性のある箇所を教えてく
れるといいですね
・・・が、現在私の追っているプロジェクトでは、仮想関数は比較的追い(と、言うか仮
想関数になっているような構造だと、どんなプロジェクトであっても、同じような用途の
関数になるはずなので追いやすい気がします)やすいので仮想関数は特定できなくてもい
いのですが
VisualStudio2005でもよければ
関数名右クリックしてポップアップメニューの「呼び出しブラウザ」に
「呼び出し先の表示」や「呼び出しもとの表示」てのがあります
>ファイルから検索で検索文字列を指定する場合には、同じ名前の関数もピックアップさ
れます
>すると、数千件単位で列挙されるので追いきれません
追いかける以上は、クラス構造とかクラスの関係についてあらかた頭に入っている
または、直ぐ参照できるような関連図があるとおもうので検索するにしてもファイルを
絞り込めそうな気がしますが、違うでしょうか?
多分、対象のファイル全体に対して関数名で検索を掛けるからそういう事になっている
わけで、クラス名::関数名等で検索すれば、少なくとももっと絞り込めると思います。
クラス構造とクラスの関係が分からない状態では多分難しいと思います。
この辺は地道に追いながら勉強するしかないような気がします。
タイトルと最初の質問だと、
「呼び出し先」なんだか「呼び出し元」なんだかわからんな
とりあえず、VC6なら、「定義と参照」ってのがある。
.net以降の「呼び出しブラウザ」と同じ目的のもの(てか、.netで名前変えすぎ)
○やり方
1:まず、ツールバーの「参照」を追加しておく(ツール→カスタマイズで)
2:調べたい関数にカーソルを置く
3:追加したツールバーの真ん中あたりにある「定義と参照」を押す。
4:あとは一目瞭然。
> とりあえず、VC6なら、「定義と参照」ってのがある。
ただし、精度はVC6のインテリセンスなどから推して知るべし、という程度。
まともな調査に使うには精度が低すぎて、漏れの可能性も高く、保証もない。
# そもそもまともに動かないことも…
デバッグの参考くらいにはなるかも。
doxygen導入するとか・・。
結局解析のほうは、調べたい関数の名称を変えてコンパイルしたり、検索ファイルを絞り
込んだりして解析をしました
一番苦労したのは関数ポインタ・・・
VC++6.0には私の望む機能はないんですね
コードの静的解析ツールなども調べてみます
皆様、アドバイスありがとうございました
> 一番苦労したのは関数ポインタ・・・
静的な解析ではどーしよーもありませんね。仮想関数も同じく。
結局、システム内のクラスの構成図やらを見てクラス間の関係をきちんと理解するしか
方法はないと思います。επιστημηさんも言われている通り、動的な部分は
これをきちんと理解して解析するしかありません。
ツールはあくまでもツールに過ぎず、それ以上でもそれ以下でもないです。
調べたい関数の名称を変えてコンパイルするのだったら
OutputDebugString等を使ってモニタリングしながら動かした方が
よっぽどわかりやすかったのではないかと言う気もします。
ただ、クラス構造がきちんと理解できていれば実際にはわかると思うんですが、
難しいですかねぇ。
それとも資料の提供が無かったんですかねぇ。
解決したようですが、蛇足情報。
MSはVCシリーズにBrowserToolKitという解析ツールを用意してます。
コンパイル時に生成されるBSCファイルを自由に解析できます。
http://www.microsoft.com/downloads/details.aspx?FamilyId=621AE185-1C2A-4D6B-
8146-183D66FE709D&displaylang=en