サンプル集  >  LinuxC  >  セグメンテーションフォルト調査
セグメンテーションフォルト調査
2015/07/24

セグメンテーションフォルトの原因調査をします。

◆環境
OS 6.0.5
Linux obsax3 3.0.6 #1 SMP Thu Mar 7 19:14:19 JST 2013 armv7l GNU/Linux
gcc 4.4.5 (Debian 4.4.5-8)
gdb 7.0.1-debian

セグメンテーションフォルトの調査をするためにコア・ダンプを出力するように設定します。

事前準備

(1)コア・ダンプの容量制限を解除します。

# ulimit -c unlimited

(2) -g オプションを付けてコンパイルします。

# gcc test.c -o test -g

デバッグ

セグメンテーションフォルトが発生するモジュールを実行します。

# ./test
[1] 3763
[1]+  Segmentation fault      (core dumped) ./test

gdbにcoreファイルを読み込ませます。

# gdb test core
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl
.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copyi
ng"
and "show warranty" for details.
This GDB was configured as "arm-linux-gnueabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/test...done.
Reading symbols from /usr/lib/libmysqlclient.so.16...(no debugging symb
ols found)...done.
Loaded symbols for /usr/lib/libmysqlclient.so.16
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...do
ne.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libm.so.6...(no debugging symbols found)...do
ne.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found
)...done.
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/libcrypt.so.1...(no debugging symbols found).
..done.
Loaded symbols for /lib/libcrypt.so.1
Reading symbols from /lib/libnsl.so.1...(no debugging symbols found)...
done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /usr/lib/libz.so.1...(no debugging symbols found).
..done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /lib/libgcc_s.so.1...(no debugging symbols found).
..done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/ld-linux.so.3...(no debugging symbols found).
..done.
Loaded symbols for /lib/ld-linux.so.3
Reading symbols from /lib/libnss_files.so.2...(no debugging symbols fou
nd)...done.
Loaded symbols for /lib/libnss_files.so.2
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0 0x40498884 in strlen () from /lib/libc.so.6
(gdb)

セグメンテーションフォルトが発生した行を特定します。

(gdb) backtrace  ←バックトレース
#0  0x40498884 in strlen () from /lib/libc.so.6
#1  0x40463c78 in vfprintf () from /lib/libc.so.6
#2  0x404813dc in vsprintf () from /lib/libc.so.6
#3  0x4046a378 in sprintf () from /lib/libc.so.6
#4  0x0000a9c0 in makeMessage (msg=0xbea64764 "0") at test.c:1207
#5  0x0000a8a4 in sendMessge (sock=4) at test.c:1145
#6  0x00009ae4 in communication (dstSocket=4) at test.c:628
#7  0x00009624 in connection (conn=0x16c80) at test.c:367
#8  0x00009430 in main () at test.c:307
(gdb) 

最終的にセグメンテーションフォルトが発生したのはstrlenでした。 そこから遡って見ていくと、strlenはvfprintfから呼び出されたようです。 vfprintfはvsprintfから、さらにvsprinfはsprintfから呼び出され、sprintfはmakeMessageから呼び出された事が分かります。 makeMessagesはtest.cにある関数で、test.cの1207行目でsprintfを呼び出してセグメンテーションフォルトになった事が分かります。

gdbが無い場合

apt-getでgdbをインストールしてください。

# apt-get install gdb

▲ PageTop  ■ Home


Copyright (C) 2015 ymlib.com