我的程序中有段错误,所以我用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发生时,我将尝试调试消息和主题的值。
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)
发布于 2021-06-27 14:40:42
,我如何知道哪一行代码会产生这样的结果?
崩溃发生在strlen
实现内部。您需要找到名为strlen
的代码。这样做的GDB命令是where
(或其等效的backtrace
)。
where
命令将显示导致崩溃的调用堆栈。如果您使用调试信息(通常是-g
)构建代码,调用堆栈将包含文件和行信息,这将准确地指向代码中执行strlen
的位置,而这些位置并不是正确的C
字符串。
https://stackoverflow.com/questions/68151749
复制相似问题