2016-08-18 10 views
0

と同様です。​​があります。しかし、私はこの質問が異なると思います。gdbがスタックの問題を壊しています。機能と行番号が表示されません。

私はgdb-cross-aarch64を使用して、アームarch64デバイスで生成されたダンプされたコアファイルを分析しています。

私のコマンドラインは次のようである:

gdb-cross-aarch64 /path_to/gst-launch-1.0 /path_to/core.2135 

gst-launch-1.0は共有ライブラリlibOmxCore.soに依存しています。ここで

gdbの出力です:

GNU gdb (GDB) 7.9.1 
Copyright (C) 2015 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "--host=x86_64-linux --target=aarch64-poky-linux". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word"... 
Reading symbols from ./work/aarch64-poky-linux/gstreamer1.0/1.4.5-r0/image/usr/bin/gst-launch-1.0...done. 
[New LWP 2135] 
[New LWP 2137] 
[New LWP 2141] 
[New LWP 2139] 
[New LWP 2138] 
[New LWP 2136] 
[New LWP 2143] 
[New LWP 2142] 
[New LWP 2140] 

warning: Could not load shared library symbols for 46 libraries, e.g. linux-vdso.so.1. 
Use the "info sharedlibrary" command to see the complete listing. 
Do you need "set solib-search-path" or "set sysroot"? 
Core was generated by `gst-launch-1.0 filesrc location=samplevideo.mp4 ! decodebin ! fakesink'. 
Program terminated with signal SIGABRT, Aborted. 
#0 0x0000007fa1d42cb0 in ??() 
(gdb) set sysroot /Disk_1/Alan_s_Work/path_to/image/ 
Reading symbols from /Disk_1/Alan_s_Work/path_to/libOmxCore.so...done. 
(gdb) bt 
#0 0x0000007fa1d42cb0 in ??() 
#1 0x0000007fa1d46120 in ??() 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 
(gdb) 

上記のように、私は、GDBにsysrootを設定した、とlibOmxCore.sogst-launch-1.0内のシンボルはgdbによって読み込まれます。

でも、有効なスタックバックトレースはgdbまで表示されません。

signal SIGABRTlibOmxCore.soにあると確信しています。

私はここで間違っていますか?それ以外に何をすべきですか?

ありがとうございました

答えて

0

これは難しいエラーです。デバッガは、提供しているコアダンプのスタックフレームを上向きに歩くことで、通常表示されるバックトレース情報を取得します。

スタックが壊れている場合は、バックトレースを作成するために使用できる有益な情報が残っていないこと、または逆引きが行われていることは明らかです:適切なバックトレースが見つからない場合は、デバッガがあなたに与えることができる致命的な助けではありません。

特に、外部ライブラリで作業しているときに破損したスタックが発生する可能性があります。いくつかは以下のとおりです。

  1. ライブラリがスタックにヒープ上に見ることを期待メモリ受け渡し
  2. (ローカル変数へのポインタを返すように)もはや有効でスタック変数へのポインタを超える
  3. 受け渡し
  4. ライブラリに、与えた変数またはバッファサイズに関する誤った記事を伝えます。
  5. ポインタではなくスカラを渡す
  6. ライブラリはバッファを割り当て、ポインタを戻すと仮定しますが、ライブラリはそれ以外の場合を想定しています。
  7. ...と他の考えられる理由の膨大な量...

手動でライブラリの要件に割り当てる必要がメモリ領域を合わせ、あなたのコードを通過します。ライブラリの所有者の所有権を調べ、それを割り当てたコードかlibかどうかを確認し、要件を満たすのに十分な大きさであることを慎重に確認します。

SIGABRTは、理由の膨大な量のためにあなたがより強くビットで見たいと思うかもしれませんいくつかを送信されている:

  1. 野生を実行中のスレッドを(つまり、ヒープについて
  2. 何のためにjoinエドされていません不適切なポインタ
  3. そして、あなたのライブラリがプログラムと上行くことは不可能であるような状況で自分自身を見つけるものとmallocfreeなどの管理。
+0

@tofroありがとうございます。 "私はシグナルSIGABRTがlibOmxCore.soで引き起こされていると確信しています。" libOmxCore.soの関数に意図的に 'assert(0)'を植えているためです。私は 'gdb'の使い方を教えたいので。 – Alan

関連する問題