我正在研究一些相当大的C ++应用程序,其中大部分代码存储在静态库中,还有一些程序使用该代码。 我看起来像内存损坏运行时崩溃:
*** Error in `build/bin/myapp': malloc(): memory corruption (fast): 0x00000000021f62a0 ***
我想检查一下发生了什么。 GDB似乎是正确的工具(操作系统:Ubuntu 14.04)。
我的makefile使用makefile命令行开关处理调试和释放。
打开时,会添加-g
标志,.a库为23.8 MB,而应用程序为519 kB。
没有,它的1.6 MB和486kB(所以我很确定调试符号 那里)。
我的(部分)CFLAGS,如gcc manual所示:
CFLAGS = -std=c++11 -g -Wall -O0 -fno-inline
我用:
运行gdbgdb --args build / bin / myapp datafile.dat -a -b(...和更多参数)
我的问题是,即使在调试版本中,gdb仍然告诉我它无法找到任何符号:
从build / bin / myapp读取符号...(未找到调试符号)...完成。
如果我在gdb中运行它,它会崩溃:
Program received signal SIGABRT, Aborted.
0x00007ffff5298cc9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
backtrace
命令确实显示符号丢失:第10到18帧缺少信息,可能与我的代码有关:
(gdb) bt
#0 0x00007ffff5298cc9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1 0x00007ffff529c0d8 in __GI_abort () at abort.c:89
#2 0x00007ffff52d5394 in __libc_message (do_abort=do_abort@entry=1, fmt=fmt@entry=0x7ffff53e3b28 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175
#3 0x00007ffff52e00f7 in malloc_printerr (action=<optimized out>, str=0x7ffff53e3ec8 "malloc(): memory corruption (fast)", ptr=<optimized out>) at malloc.c:4996
#4 0x00007ffff52e2e04 in _int_malloc (av=0x7ffff5620760 <main_arena>, bytes=36) at malloc.c:3359
#5 0x00007ffff52e47b0 in __GI___libc_malloc (bytes=36) at malloc.c:2891
#6 0x00007ffff5babe68 in operator new(unsigned long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7 0x00007ffff5c03e69 in std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#8 0x000000000045a7a5 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) ()
#9 0x00007ffff5c05bd6 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) ()
from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#10 0x000000000042df7f in ?? ()
#11 0x000000000042eef6 in ?? ()
#12 0x0000000000421dab in ?? ()
#13 0x0000000000422223 in ?? ()
#14 0x0000000000422cfe in ?? ()
#15 0x0000000000423393 in ?? ()
#16 0x0000000000424600 in ?? ()
#17 0x000000000040fd50 in ?? ()
#18 0x000000000040566d in ?? ()
#19 0x00007ffff5283ec5 in __libc_start_main (main=0x4053c0, argc=6, argv=0x7fffffffddf8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,
stack_end=0x7fffffffdde8) at libc-start.c:287
#20 0x000000000040604f in ?? ()
我确实检查了一些the many questions about这个话题,但没有任何帮助(其中大部分都与遗忘的-g
旗帜有关,或添加-s
,删除符号)。
问题:下一步可以找出崩溃发生的原因/位置?
其他信息:
gcc --version
:5.3.0 gdb --version
:7.7.1 答案 0 :(得分:1)
但没有任何帮助(其中大部分都与遗忘的-g标志有关,或者添加-s,剥离符号)。
几乎可以肯定您在链接线上某处有一个迷路-s
,或者在安装过程中在二进制文件上运行stip
。
仔细查看你的链接命令行和安装命令,那里的 条带。
P.S。正如Tom Tromey已经说过的那样,GDB很难有效地解决这样的问题。使用Valgrind或Address Sanitizer可能会让您更快地找到根本原因。