10

お客様のボックスでソフトウェアを実行することにより、コア ファイルを取得します。残念ながら、デバッグ シンボルを使用せずに常に -O2 でコンパイルしてきたため、クラッシュの原因を突き止めることができない状況が発生しました。ビルドを変更して、-g と -O2 を一緒に生成するようにしました。次に、デバッグを容易にするために -g バイナリを実行するようお客様にアドバイスします。

いくつかの質問を聞きたいんです:

  1. Dev で実行している Linux ディストリビューション以外の Linux ディストリビューションからコア ファイルが生成されるとどうなりますか? スタックトレースは意味がありますか?
  2. Linux や Solaris でのデバッグに役立つ書籍はありますか? 例指向の何かは素晴らしいでしょう。ルーチンがクラッシュした理由と、著者がどのように解決策にたどり着いたかを理解するための実際の例を探しています。私はこれをしばらくやっているので、中級から上級レベルの何かが良いでしょう. いくつかのアセンブリも同様に良いでしょう。

これは、お客様に -g ver. を入手するように伝える必要があるクラッシュの例です。バイナリの:

Program terminated with signal 11, Segmentation fault.
#0  0xffffe410 in __kernel_vsyscall ()
(gdb) where
#0  0xffffe410 in __kernel_vsyscall ()
#1  0x00454ff1 in select () from /lib/libc.so.6
...
<omitted frames>

理想的には、アプリがクラッシュした正確な理由を解決したいと考えています。メモリの破損が原因であると思われますが、100% 確実ではありません。

リモート デバッグは厳密に許可されていません。

ありがとう

4

5 に答える 5

29

Dev で実行している Linux ディストリビューション以外の Linux ディストリビューションからコア ファイルが生成されるとどうなりますか? スタックトレースは意味がありますか?

実行可能ファイルが動的にリンクされている場合、GDB が生成するスタックは (ほとんどの場合)意味がありません。

理由: GDB はlibc.so.6、アドレス0x00454ff1で何かを呼び出すことによって実行可能ファイルがクラッシュしたことを認識していますが、そのアドレスにあるコードは認識していません。のコピーを調べてlibc.so.6これが にあることを発見しselect、それを出力します。

しかし、0x00454ff1あなたの顧客のコピーにも含まれる可能性libc.so.6は非常に小さいです。おそらく、お客様はその住所で別の手続きを行っていた可能性がありますabort

を使用して、 が命令の途中にあるか、または前の命令が ではないことdisas selectを観察できます。これらのいずれかが成り立つ場合、スタック トレースは無意味です。0x00454ff1CALL

ただし、自分自身を助けることができます。リストされているすべてのライブラリのコピーを(gdb) info shared顧客のシステムから取得するだけで済みます。顧客に、たとえば次のように tar してもらいます。

cd /
tar cvzf to-you.tar.gz lib/libc.so.6 lib/ld-linux.so.2 ...

次に、システムで次のようにします。

mkdir /tmp/from-customer
tar xzf to-you.tar.gz -C /tmp/from-customer
gdb /path/to/binary
(gdb) set solib-absolute-prefix /tmp/from-customer
(gdb) core core  # Note: very important to set solib-... before loading core
(gdb) where      # Get meaningful stack trace!

次に、デバッグを容易にするために -g バイナリを実行するようお客様にアドバイスします。

より良いアプローチは次のとおりです。

  • でビルド-g -O2 -o myexe.dbg
  • strip -g myexe.dbg -o myexe
  • myexeお客様に配布
  • 顧客が を取得した場合は、デバッグにcore使用しますmyexe.dbg

完全なシンボリック情報 (ファイル/行、ローカル変数) を入手できます。特別なバイナリを顧客に出荷する必要はなく、ソースに関する詳細をあまり明らかにする必要もありません。

于 2012-05-17T03:28:21.667 に答える
2

クラッシュダンプから有用な情報を得ることができます。最適化されたコンパイルからでも(技術的には「お尻の大きな痛み」と呼ばれますが)、-gコンパイルの方が確かに優れています。もちろん、そうすることもできます。ダンプが発生したマシンが別のディストリビューションである場合。基本的に、1つの注意点がありますが、すべての重要な情報は実行可能ファイルに含まれ、最終的にはダンプに含まれます。

コアファイルを実行可能ファイルと照合すると、デバッガーはクラッシュが発生した場所を通知し、スタックを表示できるようになります。それ自体が大いに役立つはずです。また、それが発生する状況についてできるだけ多くのことを知る必要があります-彼らはそれを確実に再現できますか?もしそうなら、あなたはそれを再現できますか?

ここで注意点があります。「すべてがそこにある」という概念が崩壊する場所は、共有オブジェクトファイル、.soファイルです。それらの問題が原因で失敗した場合は、必要なシンボルテーブルがありません。.soあなたはそれがどのライブラリで起こっているかしか見ることができないかもしれません。

デバッグに関する本はたくさんありますが、私がお勧めする本は思いつきません。

于 2012-05-16T10:22:34.680 に答える
0

私が覚えている限りでは、顧客に -g オプションでビルドされたバイナリを実行するように依頼する必要はありません。必要なのは、-g オプションを使用してビルドする必要があることです。これでコア ファイルをロードでき、スタック トレース全体が表示されます。数週間前、ビルド (-g) ありと -g なしでコア ファイルを作成し、コアのサイズは同じだったことを覚えています。

于 2012-05-16T10:16:53.837 に答える
0

これの複製と見なされた私の質問から解決策をコピーします。

set solib-absolute-prefix受け入れられた解決策からは私には役に立ちませんでした。set sysrootgdb がローカルに提供されたライブラリをロードするために絶対に必要でした。コア ダンプを開くために使用したコマンドのリストを次に示します。

# note: all the .so files obtained from user machine must be put into local directory.
#
# most importantly, the following files are necessary:
#   1. libthread_db.so.1 and libpthread.so.0: required for thread debugging.
#   2. other .so files are required if they occur in call stack.
#
# these files must also be renamed exactly as the symlinks
# i.e. libpthread-2.28.so should be renamed to libpthread.so.0

# load executable file
file ./thedarkmod.x64

# force gdb to forget about local system!
# load all .so files using local directory as root
set sysroot .

# drop dump-recorded paths to .so files
# i.e. load ./libpthread.so.0 instead of ./lib/x86_64-linux-gnu/libpthread.so.0
set solib-search-path .
# disable damn security protection
set auto-load safe-path /

# load core dump file
core core.6487

# print stacktrace
bt
于 2021-09-22T04:39:45.207 に答える
0

スタックをたどったときに表示されるローカル変数の値を調べますか? 特に select() 呼び出しの周り。顧客のボックスでこれを行い、ダンプをロードしてスタックを歩くだけです...

また、DEV プラットフォームと PROD プラットフォームの両方で FD_SETSIZE の値を確認してください。

于 2012-05-16T13:47:04.103 に答える