找到真正的段错误行

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 字符串上。