2016-04-02 13 views
0

かなり大きなC++アプリケーションを扱っています。ほとんどのコードは静的ライブラリに格納されており、そのコードを使用するいくつかのプログラムがあります。 私はメモリ破損実行時のクラッシュのように見えるものを持っている:私はそれが起こる場所を確認したいデバッグ:私のシンボルはgdbにロードされませんか?

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

。 GDBは正しいツール(OS:Ubuntu 14.04)のようだ。

私のmakefileは、makefileのコマンドラインスイッチでデバッグとリリースの両方を処理します。

スイッチをオンにすると、-gフラグが追加され、.aライブラリは23.8 MB、アプリケーションは519 kBです。 なし、その1.6 MBと486 kB(だから私は確信しているデバッグシンボルです)。

gcc manualにより示唆されるように私の(部分)CFLAGS、: CFLAGS = -std=c++11 -g -Wall -O0 -fno-inline

私はGDBを実行します。

のgdb --argsビルド/ binに/ myappのdatafile.dat -a -b( ...と、複数の引数)

私の問題でもデバッグビルドでは、GDBはそれがどのシンボルを見つけることができないことを私に言って続けていることである:

ビルド/ 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

実行ファイルを 'strip'しましたか?これにより、デバッグ情報が削除されます。 –

+2

'make'の出力を見ると、すべてのフラグで実行されているすべてのコマンドが表示されます。ビルド時に '-g'フラグが表示されますか?リンク時に '-s'フラグは表示されませんか?または 'strip'コマンドを使用していますか? –

+0

ありがとうございます。しかし、すべてのビルドステップがコンソールに記録されています。** yes **、その完璧な、-gとno -sは、最初にチェックしました(私のCFLAGSを参照)。 – kebs

答えて

1

が、任意の助けなしの(最もこれらのうち、忘れた-gフラグ、またはシンボルを削除する-sが追加されています)。

それはあなたのリンク行のどこかに浮遊-sを持っているのいずれかほぼ確実ある、またはインストール時にバイナリのstipを実行します。

あなたのリンクコマンドラインを見て、慎重にコマンドをインストールしてください。はそこにあるストリップです。

P.S. Tom Tromeyがすでに述べたように、GDBはこのような問題を手助けすることはめったにありません。 ValgrindまたはAddress Sanitizerを使用すると、根本的な原因がずっと早く解決されます。

+0

コメントで説明したように、それは確かに問題でした。また、Valgrindも役立ちます、gdbは私にクラッシュの場所を与えましたが、Valgrindはもう少し情報を提供しました。 – kebs

関連する問題