调试:我的符号没有加载到gdb中?

时间:2016-04-02 17:52:46

标签: c++ linux debugging gcc gdb

我正在研究一些相当大的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

1 个答案:

答案 0 :(得分:1)

  

但没有任何帮助(其中大部分都与遗忘的-g标志有关,或者添加-s,剥离符号)。

几乎可以肯定您在链接线上某处有一个迷路-s,或者在安装过程中在二进制文件上运行stip

仔细查看你的链接命令行和安装命令,那里的 条带。

P.S。正如Tom Tromey已经说过的那样,GDB很难有效地解决这样的问题。使用Valgrind或Address Sanitizer可能会让您更快地找到根本原因。