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の値と対応するメモリアドレスの間に不一致があったことを知っています。そのような違いは、報告されたオフセットで考慮されると想定していました。クラッシュダンプで、またはとにかく、そのような違いが考慮されていない場合、問題の分岐命令が、指摘されたもののいずれかの側にあるいくつかの命令を見るでしょう...)
誰かが光を当てることができますか?