15

iOSクラッシュダンプのスタックトレースのオフセットを、otoolによって出力されたバイナリの逆アセンブルのオフセットと一致させるのに問題があります。

原則として私がこれらをどのように一致させるかを誰かが確認できますか?たとえば、クラッシュダンプに行が表示された場合:

0 myapp  0x00005b0a  0x1000 + 19210

バイナリファイル内の問題のある命令のオフセットは、0x5b0a、0x4b0a ....、または他の何かであると思いますか?

ヘッダー情報のデコードで、otoolは、たとえば、この情報も提供します(実際のコードはファイルのオフセット0x0000224cから始まります)。

Section
  sectname __text
   segname __TEXT
      addr 0x0000224c
      size 0x00063ad2
    offset 4684
     align 2^2 (4)
    reloff 0
    nreloc 0
      type S_REGULAR
attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS
 reserved1 0
 reserved2 0

したがって、これを正しく解釈しているとは100%確信できませんでしたが、ファイル内の+ 0x224cのコードは、メモリ内のオフセット0x124cで終わると言っているようですが、これがどのように行われるのか正確にはわかりませんでした。たとえば、場所0x1000に適合します。

私が抱えている問題は、たとえばオフセット0x5b0aが与えられた場合、そこの命令も0x4b0aも0x6b0aの命令も、問題の実際の命令として意味をなさないことです(たとえば、スタックのさらに下の場所がポイントしないという事実を含みます)分岐命令)。

(少なくともARMの初期の化身では、命令パイプラインのためにPCの値と対応するメモリアドレスの間に不一致があったことを知っています。そのような違いは、報告されたオフセットで考慮されると想定していました。クラッシュダンプで、またはとにかく、そのような違いが考慮されていない場合、問題の分岐命令が、指摘されたもののいずれかの側にあるいくつかの命令を見るでしょう...)

誰かが光を当てることができますか?

4

2 に答える 2

7

セグメントの仮想アドレスを__TEXT、クラッシュ ダンプで指定された相対アドレスに追加します。結果は、逆アセンブリで検索するアドレスです。手順は次のとおりです。

  1. otool -lv <application-binary>アプリケーション バイナリからロード コマンドをダンプするために使用します。__TEXT セグメントのロード コマンドとvmaddr、通常は の関連する値を探し0x1000ます。__text 上記のセクションに関する情報は必要ありません。セグメントに関する情報だけが必要です。

  2. クラッシュ ダンプでは、コール スタック内のアドレスが の形式で示されます 0x00124ff4 0xf4000 + 200692最後の部分は、 10 進数のバイナリ内のオフセットです。これを手順 1 で取得した値に加算し、16 進数に変換します。この例では、0x1000 + 200692どちらが0x31ff416 進数であるかを計算します。

  3. otool -tV <application-binary>アプリケーション バイナリの逆アセンブリをダンプするために使用します。手順 2 で取得したアドレスを見つけます (0x31ff4この例では)。コール スタックの最上位フレームの場合、これはアプリケーションがクラッシュした場所です。他のすべてのレベルでは、計算されたアドレスには、スタック内の次に高いレベルに対応する分岐命令が必要です。

于 2013-09-30T20:11:39.123 に答える
2

使用できる記号を取り除かmyappなければatos.

man atos詳細についてはいつでも確認できますが、問題にはこれで十分です。

-o symbol_file # debugging information output by the compiler this may be a dSYM or the binary itself depending on who you saved symbol information
-l load address # the base address in the process space at which your library is loaded into the springboard process (Looks like 0x1000)
Also a list of addresses you wish to symbolicate

Usage:
    atos -o myapp -l 0x1000 0x00005b0a 0x0005bca ... etc

その出力は、ターミナルへのシンボル名のリストである必要があります。繰り返しますが、これには、myappシンボルが削除されていないことが必要です。

于 2012-05-26T21:41:26.120 に答える