Gui*_*i13 4 c c++ debugging gdb
我正在开发一个嵌入式平台(架构是SH4),几分钟前我的程序用SIGABRT崩溃了.
幸运的是,我在gdbserver下运行,被这个信号中断的线程有这个堆栈转储:
#0 0x2a7f1678 in raise () from /home/[user]/target/lib/libc.so.6
#1 0x2a7f2a4c in abort () from /home/[user]/target/lib/libc.so.6
#2 0x2a81ade0 in __libc_message () from /home/[user]/target/lib/libc.so.6
#3 0x2a81f3a8 in malloc_printerr () from /home/[user]/target/lib/libc.so.6
#4 0x2a8c3700 in _IO_wide_data_2 () from /home/[user]/target/lib/libc.so.6
Run Code Online (Sandbox Code Playgroud)
你知道这里发生了什么吗?一个糟糕的免费()?坏删除?不好malloc?什么是"_IO_wide_data_2"应该做什么?我看到malloc_printerr()调用我也不明白.
谷歌给了我234个结果,但所有这些都只是因为这些人在他们的回溯中有"功能".
这是一个stderr广泛的角色支持流.
你可以把它分解成各个部分:
_IO : 输入输出.wide_data :广泛的数据2 :stderr你也有;
_IO_wide_data_0:stdin
_IO_wide_data_1:stdout
它们被链接为2-> 1-> 0.
malloc_printerr()用于在动态内存管理中发生/发生不良事件时打印各种错误消息.但你的痕迹看起来有限(你删除了什么?).
它可能是对stderr的写入,在那里你尝试写入不在内存中的内容,在损坏的内存中,...
或者它可能是较低的堆栈点导致写入stderr.
要么 …
小智 1
一个糟糕的 free() ?不好删除?坏的malloc?
是的,我认为这是其中之一。
如果该错误很容易重现,请在 malloc.c、malloc_printerr 中放置一个断点。当调试器停止在那里时,您可能会获得完整的调用堆栈并找到代码中的错误位置。我仍然不知道为什么会发生这种情况,在输入 __libc_message 后,调用堆栈被破坏。
这就是我发现这种奇怪行为的原因。删除同一缓冲区两次的简单应用程序:
void main()
{
char * buf = new char[4*1024];
delete[] buf;
delete[] buf;
}
Run Code Online (Sandbox Code Playgroud)
在 malloc_printerr 内部,调用堆栈如下所示:
#0 malloc_printerr (action=3, str=0x297d0b5c "double free or corruption (top)", ptr=<value optimized out>) at malloc.c:5887
#1 0x29750be8 in __libc_free (mem=0x411008) at malloc.c:3622
#2 0x29612c70 in operator delete (ptr=<value optimized out>) at ../../../../libstdc++-v3/libsupc++/del_op.cc:49
#3 0x29612cc2 in operator delete[] (ptr=<value optimized out>) at ../../../../libstdc++-v3/libsupc++/del_opv.cc:37
#4 0x0040068a in main (argc=1, argv=0x7bb26814) at double_free.cpp:47
Run Code Online (Sandbox Code Playgroud)
输入__libc_message后:
#0 __libc_message (do_abort=2, fmt=0x297d09c8 "*** glibc detected *** %s: %s: 0x%s *** ") at ../sysdeps/unix/sysv/linux/libc_fatal.c:50
#1 0x2974f3a8 in malloc_printerr (action=3, str=0x297d0b5c "double free or corruption (top)", ptr=<value optimized out>) at malloc.c:5887
#2 0x297f3700 in _IO_wide_data_2 () from /cygdrive/c/STM/SH4-Linux-gcc/opt/STM/STLinux2.3/devkit/sh4/target/lib/libc.so.6
Backtrace stopped: frame did not save the PC
Run Code Online (Sandbox Code Playgroud)
也许它与属性((noreturn)) 和编译器优化有关?