C言語 デバッグ
gcc の警告オプション
gcc -Wall -Wextra -Wformat=2 -Wstrict-aliasing=2 -Wcast-qual \
-Wcast-align -Wconversion -Wfloat-equal -Wpointer-arith -Wswitch-enum foo.c
valgrind
メモリリーク、メモリの不正アクセスを検出に使用する。
ruby の拡張ライブラリに対しては実行するには
valgrind -v --error-limit=no --partial-loads-ok=yes --undef-value-errors=no \
ruby test.rb 2>&1 | tee valgrind.log
などとする。
libtool で gdb を使う
gdb でデバッグするには
libtool --mode=execute gdb ./prog
とする。これは .libs/lt-prog を作り、このファイルに対して gdb を実行している。
ソースコードを修正してコンパイルして、gdb 内で run を実行したいときには http://stackoverflow.com/questions/15143739/using-libtool-e-gdb にあるように
libtool --mode=execute echo ./prog
などとして .libs/lt-prog を作ると良い。
バックトレース
coredumpsize
Ubuntu 11.10 だと coredumpsize が 0 になっている。 デバッグのためには
limit coredumpsize 10000
のように指定する。
gdb
gdb を使えばバックトレースを表示できる。
gdb a.out core
コンパイル時にgccに-gオプションをつけた場合はファイル名と行番号も表示される。
glibc
glibc に含まれる backtrace() と backtrace_symbols_fd() を使うと 実行中のCプログラムのバックトレースを表示することができる。 詳細はglibcのマニュアルを参照。
プロファイル
configure のときに -pg オプションをつける
http://ubuntuforums.org/showthread.php?t=941986 のように
CFLAGS=-pg ./configure
とする。
libtool で gprof を使う
libtool --mode=execute gprof ./prog