2015-12-08 11 views
5

目標:どのように "手動" 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の出力を表すことができます。私は次にそれを試みます。

+0

ATOS、dwarfdumpとlldb含むsymbolicatecrashが動作しない場合は、これを行うにはいくつかの方法があります。完全な象徴化プロセス[ここ](https://www.apteligent.com/developer-resources/symbolicating-an-ios-crash-report/?partner_code=GDC_so_symbolicateios)には非常に素敵な記事があります。追加のヘルプ – cjbeauchamp

答えて

関連する問題