gccとgdbでバックトレース
研究用のシミュレータがC++で書かれていてそれを拡張するためにやはりC++を使うんだけど,Fedora7標準のエディタとmakeで原始的にやっていくことにすぐ限界を感じてその解決方法がわかったのがつい最近のこと.
Python,RubyなんかのLL言語では下のように例外が発生したら自動的にトレースバックを表示してくれるんだけど,Cでは例外が発生しても例外が発生した事実しか教えてくれない.
>>> def foo(): ... a = 10 ... return a/0 ... >>> foo() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in foo ZeroDivisionError: integer division or modulo by zero
まぁ,基本的にはここのサイトに全部書いてくれてるんだけどね.
普通のやつらの下を行け: C でバックトレース表示 - bkブログ
gcc+gdbによるプログラムのデバッグ 第2回 変数の監視、バックトレース、その他のコマンド
gcc -g -O0 [ターゲットファイル名]
とすることで最適化なしでデバッグ情報を埋め込んでくれる.注意しないといけないのは最近のOSだとデフォルトでコアを吐いてくれないので設定をちょっと変えてやらないといけない.
ulimit -c unlimited
ulimitはシステムで使うリソースの量を設定できるらしいんだけど,デフォルトではコアダンプに使えるリソースが0に設定されているので何も吐き出してくれない.unlimited(制限なし)にするとプログラムが途中で落ちた時にカレントディレクトリに「core.2673」みたいなファイルが生成されて,gdbでこれを解析するとどういう順番で関数が呼ばれたかを知ることができる.
さらに快適なプログラミング環境を求めてEclipseも導入してみた.インテリセンスはVisual Studioに劣るけど(反応が少し遅いと思う)やっぱり出てくれるだけで非常に楽だ.
Eclipse本でも買ってもらおうかな.
参考リンク:
Using and Porting the GNU Compiler Collection (GCC) - GCCコマンド・オプション
ITmedia エンタープライズ : Linux Tips「RPMでインストールしたがコマンド名が分からない」