我在linux上编写了一个C程序来处理大量数据。大多数时候它似乎工作正常,但我在工作时遇到了分段错误错误。因为该程序与其他数据一起工作正常,所以我不知道如何处理这个问题。那么在发生段错误时如何检索变量值呢?
这是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
答案 0 :(得分:1)
您需要编译并链接-g
标志才能使用调试器;但你似乎已经这样做了。 print
(缩写为p
)打印变量值; bt
,up
,down
,frame
是其他有用的命令。否则,gdb中的help
或info gdb
。
答案 1 :(得分:1)
在这种情况下,您可以使用coredump。首先启用coredumps ulimit -c unlimited
...使用gdb就像这个gdb <path to executable> <path to coredump>
...在segfault时这个coredump将包含变量和框架等的值完整....所以你可以将这些信息用于调试目的。