【问题标题】:Debugging: my symbols don't get loaded in gdb?调试:我的符号没有加载到 gdb 中?
【发布时间】: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


【解决方案1】:

但没有任何帮助(其中大部分与被遗忘的 -g 标志或添加的 -s 相关,以去除符号)。

几乎可以肯定你要么在链接行的某处有一个流浪的-s,要么在安装过程中在二进制文件上运行stip

查看您的链接命令行并仔细安装命令,那里有 条带。

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

【讨论】:

  • 谢谢,正如我在评论中解释的那样,这确实是问题所在。而且,是的,Valgrind 也很有帮助,gdb 给了我崩溃的位置,但 Valgrind 提供了更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多