■プログラム全体を把握する-FuncTree
プログラム全体の把握には、関数ツリーを作ってみるのがわかりやすいでしょう。
プログラマ's 研究所にあるC言語関数ツリーで紹介されているFuncTreeというプログラムが便利でお勧めです。
コマンドラインで動作し、ソースも配布されていますので、makefileを作成し、一部のソースを修正するだけで、Linux,SunOSなどの各種UNIXでも動作する点が嬉しいところです。
参考までに、SunOSで実際にmakeできる、makefileを紹介します。
注意点もmakefileに書いてありますので、このとおりにすれば、OKです。
gccのバージョンが新しい場合は、一部の作業は不要かもしれません。
以前私が作成したcygwin.makを最新版のft1502.lzhに収録していただいたのですが、それに若干の修正を加えたものです。基本的には、このmakefileで差し替え可能です。
テキストエリアをコピーして、sunos.makとして保存してください。勿論、文字コードは、EUCにしておきましょう。

参考書籍:
一押しは、


<TIPS>ifdefだらけのソースへの対応策
ここでは、ifdefだらけのソースをfunctreeで比較的簡単に扱える方法を解説します。
functreeでは、設定ファイルにマクロ定義を書いておくと、プリプロセッサのごとく、処理してくれます。ただ、ある程度のプロジェクトの場合、makefileがすでに用意されている場合がほとんどですので、これを流用するほうがスマートではないでしょうか。
そこで・・・
拡張子Cファイルを拡張子PCCに出力する例です。
以下の記述をプロジェクトに合わせてカスタマイズしてmakefileに追加し、
make pcc
するか、allの依存関係に追加しておけば、pcc拡張子のファイルが存在しなければ勝手に作るようになります。
あとは、functree -Rmodule *.pcc
だけで関数ツリーが作成できます。
functree -Zmudule *.pcc とすると、逆向きツリーが取得できます。
実はこっちのほうが便利で私はこっちばかり使っています。
ここでは、プリプロセッサにcppを使用していますが、お使いの環境に合わせて変更してください。
また、cppの行に、インクルードパス、マクロ定義を示す変数を指定しておけば、コンパイラが使用するソースと同じものができます。
これに加え、ローカル定義してある#defineもプリプロセッサで展開されますので、平易なソースであれば、完全な関数ツリーが得られるはずです。





■シンボルの解析
シンボルの解析にもいろいろな手法がありますが、以下のUNIXコマンドを利用するとよいでしょう。
  • nm
    シンボル情報の表示に利用
  • objdump
    nmでシンボル情報を得たら、特定区間のアドレスを逆アセンブルしたり、ソース行をインラインで表示したりも出来るので、使いこなせれば何かと有用。
    ここまで出来るようになると、危険な道へ進めるかも??




■お知らせと連絡先

このウェブサイトで取り上げて欲しい話題や分かりにくい点などありましたら、
以下のメールアドレス宛にメッセージをいただければ、参考にさせていただきます。

メールアドレスは、work_komiあっとまーくyahoo.co.jpです。
(「あっとまーく」は、半角英数のあっとまーくに変換してね。)

また、XBOXをお使いの方は、ゲーマータグ(akbox)にてフレンドリクエストを受け付けています。