找到真正的段错误行
find the real line of segfault
我的程序有段错误,所以我用 gdb 运行,
段错误是这样显示的
Thread 5 "acd" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff56bb700 (LWP 51279)]
__strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:96
96 ../sysdeps/x86_64/multiarch/strlen-avx2.S: No such file or directory.
(gdb)
我怎么知道是哪一行代码产生的?
更新
这里就是这个地方,我会尝试在这个carsh发生的时候调试message和topic的值
Thread 5 "acd" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff56bb700 (LWP 53721)]
__strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:96
96 ../sysdeps/x86_64/multiarch/strlen-avx2.S: No such file or directory.
(gdb)
(gdb)
(gdb) up
#1 0x00007ffff737be95 in __vfprintf_internal (s=s@entry=0x7ffff56bab90,
format=format@entry=0x7ffff7511006 "Invalid %s eyecatcher %d in heap item at file %s line %d", ap=ap@entry=0x7ffff56bad10,
mode_flags=mode_flags@entry=2) at vfprintf-internal.c:1688
1688 vfprintf-internal.c: No such file or directory.
(gdb) up
#2 0x00007ffff738f11a in __vsnprintf_internal (
string=string@entry=0x7ffff751cca0 <msg_buf> "Invalid end eyecatcher -145667405 in heap item at file depth 1", maxlen=<optimized out>,
maxlen@entry=512, format=format@entry=0x7ffff7511006 "Invalid %s eyecatcher %d in heap item at file %s line %d", args=args@entry=0x7ffff56bad10,
mode_flags=mode_flags@entry=2) at vsnprintf.c:114
114 vsnprintf.c: No such file or directory.
(gdb) up
#3 0x00007ffff7431022 in ___vsnprintf_chk (s=s@entry=0x7ffff751cca0 <msg_buf> "Invalid end eyecatcher -145667405 in heap item at file depth 1",
maxlen=maxlen@entry=512, flag=flag@entry=1, slen=slen@entry=512,
format=format@entry=0x7ffff7511006 "Invalid %s eyecatcher %d in heap item at file %s line %d", ap=ap@entry=0x7ffff56bad10) at vsnprintf_chk.c:34
34 vsnprintf_chk.c: No such file or directory.
(gdb) up
#4 0x00007ffff7509768 in vsnprintf (__ap=0x7ffff56bad10, __fmt=0x7ffff7511006 "Invalid %s eyecatcher %d in heap item at file %s line %d", __n=512,
__s=0x7ffff751cca0 <msg_buf> "Invalid end eyecatcher -145667405 in heap item at file depth 1") at /usr/include/x86_64-linux-gnu/bits/stdio2.h:80
80 return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
(gdb) up
#5 Log (log_level=log_level@entry=LOG_ERROR, msgno=msgno@entry=13,
format=format@entry=0x7ffff7511006 "Invalid %s eyecatcher %d in heap item at file %s line %d") at src/Log.c:438
438 vsnprintf(msg_buf, sizeof(msg_buf), format, args);
(gdb) up
#6 0x00007ffff74fa786 in checkEyecatchers (file=file@entry=0x7ffff7514ab3 "src/MQTTClient.c", line=line@entry=611, p=p@entry=0x5555555e17c8,
size=<optimized out>) at src/Heap.c:234
234 Log(LOG_ERROR, 13, msg, "end", us, file, line);
(gdb) up
#7 0x00007ffff74fa818 in Internal_heap_unlink (file=file@entry=0x7ffff7514ab3 "src/MQTTClient.c", line=line@entry=611, p=p@entry=0x5555555e17c8)
at src/Heap.c:258
258 checkEyecatchers(file, line, p, s->size);
(gdb) up
#8 0x00007ffff74faa49 in myfree (file=file@entry=0x7ffff7514ab3 "src/MQTTClient.c", line=line@entry=611, p=0x5555555e17c8) at src/Heap.c:282
282 if (Internal_heap_unlink(file, line, p))
(gdb) up
#9 0x00007ffff750c44a in MQTTClient_freeMessage (message=message@entry=0x7ffff56bae88) at src/MQTTClient.c:611
611 free((*message)->payload);
(gdb) up
#10 0x0000555555577e90 in messageArrived (context=<optimized out>, topicName=0x5555555dfa48 "aster001/308555098653740", topicLen=<optimized out>,
message=<optimized out>) at /home/aster/acd/src/MQTTInterface/MQTTInterface.c:113
113 MQTTClient_freeMessage(&message);
(gdb) up
#11 0x00007ffff750e64a in MQTTClient_run (n=<optimized out>) at src/MQTTClient.c:862
862 rc = (*(m->ma))(m->context, qe->topicName, topicLen, qe->msg);
(gdb) up
#12 0x00007ffff78b0609 in start_thread (arg=<optimized out>) at pthread_create.c:477
477 pthread_create.c: No such file or directory.
(gdb) up
#13 0x00007ffff7422293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
95 ../sysdeps/unix/sysv/linux/x86_64/clone.S: No such file or directory.
(gdb) up
Initial frame selected; you cannot go up.
(gdb)
How can I know which line of code produces this ?
崩溃发生在 strlen
实现中。您需要找到调用 strlen
的代码。执行此操作的 GDB 命令是 where
(或等效的 backtrace
)。
where
命令将显示导致崩溃的调用堆栈。如果您使用调试信息(通常 -g
)构建代码,调用堆栈将包含文件和行信息,这些信息将 准确地 指向代码中执行 strlen
在不正确的 C
字符串上。
我的程序有段错误,所以我用 gdb 运行,
段错误是这样显示的
Thread 5 "acd" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff56bb700 (LWP 51279)]
__strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:96
96 ../sysdeps/x86_64/multiarch/strlen-avx2.S: No such file or directory.
(gdb)
我怎么知道是哪一行代码产生的?
更新
这里就是这个地方,我会尝试在这个carsh发生的时候调试message和topic的值
Thread 5 "acd" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff56bb700 (LWP 53721)]
__strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:96
96 ../sysdeps/x86_64/multiarch/strlen-avx2.S: No such file or directory.
(gdb)
(gdb)
(gdb) up
#1 0x00007ffff737be95 in __vfprintf_internal (s=s@entry=0x7ffff56bab90,
format=format@entry=0x7ffff7511006 "Invalid %s eyecatcher %d in heap item at file %s line %d", ap=ap@entry=0x7ffff56bad10,
mode_flags=mode_flags@entry=2) at vfprintf-internal.c:1688
1688 vfprintf-internal.c: No such file or directory.
(gdb) up
#2 0x00007ffff738f11a in __vsnprintf_internal (
string=string@entry=0x7ffff751cca0 <msg_buf> "Invalid end eyecatcher -145667405 in heap item at file depth 1", maxlen=<optimized out>,
maxlen@entry=512, format=format@entry=0x7ffff7511006 "Invalid %s eyecatcher %d in heap item at file %s line %d", args=args@entry=0x7ffff56bad10,
mode_flags=mode_flags@entry=2) at vsnprintf.c:114
114 vsnprintf.c: No such file or directory.
(gdb) up
#3 0x00007ffff7431022 in ___vsnprintf_chk (s=s@entry=0x7ffff751cca0 <msg_buf> "Invalid end eyecatcher -145667405 in heap item at file depth 1",
maxlen=maxlen@entry=512, flag=flag@entry=1, slen=slen@entry=512,
format=format@entry=0x7ffff7511006 "Invalid %s eyecatcher %d in heap item at file %s line %d", ap=ap@entry=0x7ffff56bad10) at vsnprintf_chk.c:34
34 vsnprintf_chk.c: No such file or directory.
(gdb) up
#4 0x00007ffff7509768 in vsnprintf (__ap=0x7ffff56bad10, __fmt=0x7ffff7511006 "Invalid %s eyecatcher %d in heap item at file %s line %d", __n=512,
__s=0x7ffff751cca0 <msg_buf> "Invalid end eyecatcher -145667405 in heap item at file depth 1") at /usr/include/x86_64-linux-gnu/bits/stdio2.h:80
80 return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
(gdb) up
#5 Log (log_level=log_level@entry=LOG_ERROR, msgno=msgno@entry=13,
format=format@entry=0x7ffff7511006 "Invalid %s eyecatcher %d in heap item at file %s line %d") at src/Log.c:438
438 vsnprintf(msg_buf, sizeof(msg_buf), format, args);
(gdb) up
#6 0x00007ffff74fa786 in checkEyecatchers (file=file@entry=0x7ffff7514ab3 "src/MQTTClient.c", line=line@entry=611, p=p@entry=0x5555555e17c8,
size=<optimized out>) at src/Heap.c:234
234 Log(LOG_ERROR, 13, msg, "end", us, file, line);
(gdb) up
#7 0x00007ffff74fa818 in Internal_heap_unlink (file=file@entry=0x7ffff7514ab3 "src/MQTTClient.c", line=line@entry=611, p=p@entry=0x5555555e17c8)
at src/Heap.c:258
258 checkEyecatchers(file, line, p, s->size);
(gdb) up
#8 0x00007ffff74faa49 in myfree (file=file@entry=0x7ffff7514ab3 "src/MQTTClient.c", line=line@entry=611, p=0x5555555e17c8) at src/Heap.c:282
282 if (Internal_heap_unlink(file, line, p))
(gdb) up
#9 0x00007ffff750c44a in MQTTClient_freeMessage (message=message@entry=0x7ffff56bae88) at src/MQTTClient.c:611
611 free((*message)->payload);
(gdb) up
#10 0x0000555555577e90 in messageArrived (context=<optimized out>, topicName=0x5555555dfa48 "aster001/308555098653740", topicLen=<optimized out>,
message=<optimized out>) at /home/aster/acd/src/MQTTInterface/MQTTInterface.c:113
113 MQTTClient_freeMessage(&message);
(gdb) up
#11 0x00007ffff750e64a in MQTTClient_run (n=<optimized out>) at src/MQTTClient.c:862
862 rc = (*(m->ma))(m->context, qe->topicName, topicLen, qe->msg);
(gdb) up
#12 0x00007ffff78b0609 in start_thread (arg=<optimized out>) at pthread_create.c:477
477 pthread_create.c: No such file or directory.
(gdb) up
#13 0x00007ffff7422293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
95 ../sysdeps/unix/sysv/linux/x86_64/clone.S: No such file or directory.
(gdb) up
Initial frame selected; you cannot go up.
(gdb)
How can I know which line of code produces this ?
崩溃发生在 strlen
实现中。您需要找到调用 strlen
的代码。执行此操作的 GDB 命令是 where
(或等效的 backtrace
)。
where
命令将显示导致崩溃的调用堆栈。如果您使用调试信息(通常 -g
)构建代码,调用堆栈将包含文件和行信息,这些信息将 准确地 指向代码中执行 strlen
在不正确的 C
字符串上。