2016-04-02 63 views
0

我正在研究一些相當大的C++應用程序,其中大部分代碼存儲在靜態庫中,以及一些使用該代碼的程序。 我有什麼看起來像一個內存破壞運行時崩潰:調試:我的符號不會被加載到gdb中?

*** Error in `build/bin/myapp': malloc(): memory corruption (fast): 0x00000000021f62a0 *** 

我想查一下出現這種情況。 GDB似乎是正確的工具(操作系統:Ubuntu 14.04)。

我的makefiles使用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構建/斌/ MYAPP datafile.dat -a -b( ...更多參數)

我的問題是,即使在調試版本,GDB不斷告訴我,它無法找到任何符號:

從build/bin/myapp中讀取符號...(找不到調試符號)...完成。

如果我從GDB中運行它,它崩潰了:

Program received signal SIGABRT, Aborted. 
0x00007ffff5298cc9 in __GI_raise ([email protected]=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 ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x00007ffff529c0d8 in __GI_abort() at abort.c:89 
#2 0x00007ffff52d5394 in __libc_message ([email protected]=1, [email protected]=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 ??() 

我做了檢查一些themanyquestionsabout這個話題,但沒有任何幫助(大多數爲r的引發被遺忘的-g標誌或添加-s,剝離符號)。

問題:下一步是什麼可以找出爲什麼/我的崩潰發生在哪裏?

附加信息:

  • gcc --version:5.3.0
  • gdb --version:7.7.1
  • 代碼依賴:升壓和OpenCV
+0

你是否帶過可執行文件?這將刪除調試信息。 –

+2

看看'make'的輸出,它顯示所有正在執行的所有標誌。建築時是否顯示'-g'標誌?鏈接時不顯示'-s'標誌?或者使用'strip'命令? –

+0

謝謝你們,但是每一個構建步驟都會被記錄到控制檯,而** yes **,它完全沒問題,-g和no -s,我一開始就檢查過(見我的CFLAGS)。 – kebs

回答

1

但沒有任何幫助(最其中涉及到一個被遺忘的-g標誌,或者一個被添加的標誌,剝離符號)。

這是幾乎可以肯定,你要麼有一個流浪-s某處你的鏈接線,或在安裝期間運行的二進制stip

看看你的鏈接命令行並仔細安裝命令,那裏在那裏的某處。

P.S.正如Tom Tromey所說的,GDB在幫助解決這樣的問題方面很少有效。使用Valgrind或Address Sanitizer可能會讓你的根本原因更快。

+0

謝謝,正如我在評論中解釋的那樣,確實是這個問題。是的,Valgrind也有幫助,gdb給了我崩潰的位置,但Valgrind提供了更多信息。 – kebs

相關問題