iPhoneでCrash Logから関数の位置を特定する

written by shn, on Mar 15, 2009 2:54:00 AM.

iPhoneの素晴しいところの一つは、Crash Logが本体に保存される事なんですが、

Thread 0 Crashed:
0   libobjc.A.dylib                 0x300c8c18 objc_msgSend + 20
1   Fastweet2k                      0x00016240 0x1000 + 86592
2   UIKit                           0x30b2b414 -[UITextView keyboardInputChanged:] + 80
3   UIKit                           0x30bcaf1c -[UIWebDocumentView keyboardInputChanged:] + 40

このように、デバッグバイナリでもシンボルが出ないときがあります。 symolicatecrashを使ってもだめでがっかり。

でも、dSYMがあるから頑張ればなんとかなるんじゃね?とやってみたらなんとかなった。 普段VisualStudioの微温湯に浸かっている僕には大変でした。

% gdb --quiet Fastweet2k.app.dSYM/Contents/Resources/DWARF/Fastweet2k
(gdb) info line *0x16240
Line 179 of "/Users/shn/Documents/projects/git/fastweet/Classes/TweetViewController.m" starts at address 0x16212 <-[TweetViewController sendPressed:]+118> and ends at 0x162e4 <-[TweetViewController sendPressed:]+328>.

てな感じ。

上記のCrash Logはdebug版バイナリのものだったので、_./build/Debug-iphoneos/_にあるdSYMをgdbで開き、info lineコマンドで、対応するソースコードの位置が出てきます。

しかし、出てきたのは良いが何故ここでハングアップするのか、というか何故あの操作でこの関数が呼ばれるのか不明で泣きそう。

ついでに、symbolicatecrashの解説はここが詳しいです。

Leave a Reply