目標:どのように "手動" symbolicate [NSThread callStackSymbols](ATOSの開始アドレスを取得)(iOS版)へ
私は[NSThread callStackSymbols]
の "出力" をsymbolicateたいです。
サイドノート:
私はクラッシュログでそれを行う方法を知っています。しかし、私はコールスタックを調べたいいくつかの問題を調査する必要があります。残念なことに、これらのフレームワークのアドレスはすべて<redacted>
です。正しいポイントでクラッシュする(または最後に私の質問の終わりを見てください)、実際には受け入れられませんが、私が別の解決策を見つけることができなければ、それは行く道になります。
デバイスでテストを実行する必要があるため、シミュレータを使用できません。私はこれを呼び出すとき
:
現在のアプローチ
NSLog(@"call stack:\n%@", [NSThread callStackSymbols]);
を、私はこの出力を得る:
2015-12-08 15:04:03.888 Conversion[76776:4410388] call stack:
(
0 Conversion 0x000694b5 -[ViewController viewDidLoad] + 128
1 UIKit 0x27259f55 <redacted> + 1028
...
9 UIKit 0x274f67a7 <redacted> + 134
10 FrontBoardServices 0x2b358ca5 <redacted> + 232
11 FrontBoardServices 0x2b358f91 <redacted> + 44
12 CoreFoundation 0x230e87c7 <redacted> + 14
...
16 CoreFoundation 0x23038ecd CFRunLoopRunInMode + 108
17 UIKit 0x272c7607 <redacted> + 526
18 UIKit 0x272c22dd UIApplicationMain + 144
19 Conversion 0x000767b5 main + 108
20 libdyld.dylib 0x34f34873 <redacted> + 2
)
(この出力の "変換は" アプリです。)
このコマンドを使用すると、広告を「記号化」できますドレス:(もちろん-l
のための適切な値を持つ)ような
xcrun atos -o /path/to/Conversion.app -arch arm64 -l 0x0???
ランは、私が0x000694b5
のようなアドレスを入力することができ、それが-[ViewController viewDidLoad] + 128
のようなものを吐き出すます。もちろん、問題は開始アドレス(-lオプションの値)です。
私がクラッシュログを持っているとき、私はそれらを得ることができます。しかし、私はクラッシュせずに離れて行きたいです。
質問:
Q1:私は、実行時に開始アドレスを決定し、多分私はATOS -l
オプションにそれを養うことができるようにログ出力に含めることができますか?
EDIT:これは、このように可能であるように見えます:(答えhttps://stackoverflow.com/a/12464678/1396265ためNSProgrammerのおかげで)
#import <mach-o/dyld.h>
...
intptr_t slide = _dyld_get_image_vmaddr_slide(0);
const struct mach_header * load_addr = _dyld_get_image_header(0);
NSLog(@"slide %lx load addr %lx", (long)slide, (long)load_addr);
/EDIT
(私は、フレームワークのメソッド呼び出しに興味がありますように、私は確かに必要アプリケーションの開始アドレスが頻繁に変更され(ランダム化)、フレームワークの開始アドレスがランダム化されているかどうかはまだ分かりません。
Q2:コールスタックのメソッドを調べる他の方法はありますか? (私のシナリオではブレークポイントもやや不器用です。)
EDIT:
Q3:はどのように私はフレームワークのアドレスをsymbolicateことができますか?たとえば、どこでUIKitのdSYM(またはそれに関係なく)を見つけることができますか?
(たとえば私は、何かを持っている:。~/Library/Developer/Xcode/iOS\ DeviceSupport/9.1\ \(13B143\)/Symbols/System/Library/Frameworks/UIKit.framework/
を私はここに詳細に見ていきます。)
/EDIT
多分解決策:
一つの方法があるかもしれない、とログ出力をファイルに保存し、テストの最後にアプリケーションにクラッシュを引き起こします。こうすることで、クラッシュログに開始アドレスが表示され、ログからのコールスタック情報でcallStackSymbols
の出力を表すことができます。私は次にそれを試みます。
ATOS、dwarfdumpとlldb含むsymbolicatecrashが動作しない場合は、これを行うにはいくつかの方法があります。完全な象徴化プロセス[ここ](https://www.apteligent.com/developer-resources/symbolicating-an-ios-crash-report/?partner_code=GDC_so_symbolicateios)には非常に素敵な記事があります。追加のヘルプ – cjbeauchamp