2009-09-21 2 views
11

セグメンテーション違反RIP/RSP番号とは何それらを使用する方法を私のLinuxアプリケーションがクラッシュし、それはのようなログの何かに行を生成

セグメンテーション違反RIP 00003f32a823 RSP 4

は何000123ade323エラー0000000でそれらのリッピングとrspアドレス?どのように問題を特定するためにそれらを使用するのですか?それらは "objdump"または "readelf"出力の何かに対応していますか?私のプログラムがそのシンボルを削除して(gdbを使って使うことができる別のファイルに)便利なのでしょうか?

答えて

7

まあ、リップポインタはクラッシュの原因となった命令を伝えます。あなたは地図ファイルでそれを調べる必要があります。

マップファイルには、機能のリストとその開始アドレスがあります。アプリケーションをロードすると、アプリケーションはベースアドレスにロードされます。リップポインタ - ベースアドレスはあなたにマップファイルアドレスを与えます。その後、マップファイルを検索して、リッピングポインタより少し下のアドレスから始まり、リスト内のアドレスが高い関数によってクラッシュした関数を見つけた場合は、関数を探します。

そこから、コード内で何が問題になったのかを特定する必要があります。それほど楽しいものではありませんが、少なくとも、あなたには出発点があります。

編集: "segfault at"ビットは、あなたがNULLポインタを逆参照したことを私に賭けてもらいたいと言っています。 rspは現在のスタックポインタです。悲しいことに、おそらくそれほど有用ではない。あなたが最適化されたビルド

3

のどこにいるメモリで、私が得た、あなたが関数内になったと思いますどこより正確に把握することができ、「あり」ダンプが、まさに、うまくは本当に難しいことができますエラーもあります。私が見たとき:

probe.out[28503]: segfault at 0000000000000180 rip 00000000004450c0 rsp 00007fff4d508178 error 4 

probe.outはlibavformat(ffmpeg)を使っているアプリです。私はそれを分解した。

objdump -d probe.out 

RIPは命令が実行される場所である。最終的には

00000000004450c0 <ff_rtp_queued_packet_time>: 
    4450c0:  48 8b 97 80 01 00 00 mov 0x180(%rdi),%rdx 
    44d25d:  e8 5e 7e ff ff   callq 4450c0 <ff_rtp_queued_packet_time> 

、私はアプリが機能ff_rtp_queued_pa​​cket_time

PS中に墜落しました。時にはアドレスが正確に一致しない場合もありますが、ほぼそこにあります。

関連する問題