【发布时间】:2016-07-22 11:16:50
【问题描述】:
我正在开发一些相当大的 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
我运行 gdb:
gdb --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 - 代码依赖:boost 和 opencv
【问题讨论】:
-
你
strip是可执行文件吗?这会删除调试信息。 -
查看
make的输出,它显示了正在执行的所有带有所有标志的命令。构建时是否显示-g标志?链接时不显示-s标志?还是使用strip命令? -
谢谢大家,但是每个构建步骤都会记录到控制台,是的,它完全没问题,-g 和没有 -s,我一开始检查了(见我的 CFLAGS )。
-
哎哟!对不起大家!在我的链接制作食谱中有一个硬编码 -s(来自我的 LDFLAGS)。原来它剥夺了一切!!!现在修复了,我可能会删除它...
-
仅供参考,对于内存损坏问题,使用
valgrind通常会比使用gdb更快地发现错误。
标签: c++ linux debugging gcc gdb