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

Tags of current page

, ,