【问题标题】:find the real line of segfault找到段错误的真实行
【发布时间】:2021-09-10 01:45:28
【问题描述】:

我的程序有段错误,所以我让它用 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)

我怎么知道是哪一行代码产生了这个?


更新

这是发生这种情况的地方,当这种情况发生时,我会尝试调试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)

【问题讨论】:

  • 您是否使用调试信息构建了您的代码?然后转到 up 调用堆栈,直到您自己的代码。然后,GDB 将能够准确地告诉您崩溃发生在代码中的哪个位置,并让您检查变量。我建议您快速搜索 GDB 教程或备忘单。

标签: segmentation-fault gdb


【解决方案1】:

我怎么知道是哪一行代码产生了这个?

崩溃发生在strlen 实现内部。您需要找到名为strlen 的代码。执行此操作的 GDB 命令是 where(或其等效的 backtrace)。

where 命令将显示导致崩溃的调用堆栈。如果您使用调试信息(通常为-g)构建代码,则调用堆栈将包含文件和行信息,这将准确指向代码中执行strlen 的位置不是正确的 C 字符串。

【讨论】:

  • 我刚刚编辑了问题以添加 gdb stacktrace
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 2020-11-08
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
相关资源
最近更新 更多