2012-03-22 4 views
1

大量のデータを処理するためにlinuxでCプログラムを書いた。ほとんどの場合、正常に動作しているように見えましたが、ジョブを実行するときにセグメント化エラーが発生しました。プログラムは他のデータでも正常に動作するので、この問題に対処する方法はわかりません。そして、segfaultが発生したときにどのように変数値を取得するのか?ここGDBでセグメンテーションフォールトを処理するには?

はgdbの出力です:

Program received signal SIGSEGV, Segmentation fault. 
tyn_p4d_encode32 (in=0x10000000c01, cnt_in=118248, out=0x10000000101 <Address 0x10000000101 out of bounds>, add_termination=1) at tyn_coder.c:645 
645       length_stat[count_bits32(*(in + i)) - 1]++;  
Missing separate debuginfos, use: debuginfo-install glibc-2.14.90-24.fc16.6.x86_64 zlib-1.2.5-5.fc16.x86_64 
(gdb) bt 
#0 tyn_p4d_encode32 (in=0x10000000c01, cnt_in=118248, out=0x10000000101 <Address 0x10000000101 out of bounds>, add_termination=1) at tyn_coder.c:645 
#1 0x0000000000404582 in nodes_term32_flush (array=<optimized out>, size=<optimized out>, nodes_context=0x2ded020, is_last=0) at tyn_indexer.c:116 
#2 0x0000000000407b78 in tyn_exsorter_sort (exsorter=0x64c4a0, context=0x2ded020, nodes_flush=0x404320 <nodes_term32_flush>, progress_callback=0x404190 <progress_callback>) at tyn_exsorter.c:131 
#3 0x0000000000406ddf in tyn_build_index (tyn_config=0x61a060, index_name=0x4138d1 "mysql_index") at tyn_indexer.c:731 
#4 0x0000000000403850 in main (argc=<optimized out>, argv=<optimized out>) at tyn_indexer.c:943 

答えて

1

あなたは、デバッガを使用できるようにコンパイルし-gフラグを付けてリンクする必要があります。しかしあなたはすでにそれをやっているようです。 print(略称p)は可変値を出力します。 btupdownframeは他の有用なコマンドです。それ以外の場合は、gdb内のhelpまたはinfo gdbです。

+0

'$ 1 = 'これを最適化しない方法は? –

+0

@MickeyShine最適化せずにコンパイルする必要があります。 – zvrba

1

この場合、コアダンプを使用することができます。まず最初に、コアダンプを有効にしてくださいulimit -c unlimited ...このようにgdbを使用してくださいgdb <path to executable> <path to coredump> ...このコアダンプでは、segfaultの時点で変数やフレームなどの値はそのまま残っていますので、この情報をデバッグの目的で使用できます。

関連する問題