我的应用程序是用Objective c和c ++编写的。我正在使用xcode 4.5,当然我有开发者帐户,我的设备没有越狱,我已经在我的开发者帐户中设置了所有内容。 我不使用xcode中的“设备日志”,而是实现了信号/异常处理程序,将堆栈跟踪写入文件,并在下次启动应用程序时将其发送到我的网络服务器。
要在崩溃时获得堆栈跟踪,我使用[NSException callStackSymbols]。有用。所以,当我做样品崩溃时:
NSArray *arr=[NSArray array];
[arr objectAtIndex:100];
在xcode中调试并从设备上的xcode app安装启动时我得到:
0 CoreFoundation 0x36c738a7 __exceptionPreprocess + 186
1 libobjc.A.dylib 0x3308a259 objc_exception_throw + 32
2 CoreFoundation 0x36bcb23d -[__NSArrayI objectAtIndex:] + 164
3 MyApp 0x001be505 _ZN8Menu6handleEN12GestureE + 912
4 MyApp 0x000e6ce1 _ZN13BaseLevel10handleBaseEN12GestureE + 440
5 MyApp 0x0011b747 _ZN12Manager6handleEN12GestureE + 742
6 MyApp 0x00102731 _ZN13Processor9doProcessEd + 552
7 GLKit 0x3723a0c5 -[GLKViewController _updateAndDraw] + 272
8 CoreFoundation 0x36bd27d3 -[NSObject performSelector:] + 38
9 QuartzCore 0x3233486f _ZN2CA7Display11DisplayLink8dispatchEyy + 166
10 QuartzCore 0x323347c5 _ZN2CA7Display16IOMFBDisplayLink8callbackEP21__IOMobileFramebufferyyyPv + 60
MyApp c ++和objc类和方法符号确定。
但是,当我制作AdHoc ipa,并在其中做同样的工作时,我得到:
0 CoreFoundation 0x36c738a7 __exceptionPreprocess + 186
1 libobjc.A.dylib 0x3308a259 objc_exception_throw + 32
2 CoreFoundation 0x36bcb23d -[__NSArrayI objectAtIndex:] + 164
3 MyApp 0x001be505 _mh_execute_header + 894213
4 MyApp 0x000e6ce1 _mh_execute_header + 11489
5 MyApp 0x0011b747 _mh_execute_header + 227143
6 MyApp 0x00102731 _mh_execute_header + 124721
7 GLKit 0x3723a0c5 -[GLKViewController _updateAndDraw] + 272
8 CoreFoundation 0x36bd27d3 -[NSObject performSelector:] + 38
9 QuartzCore 0x3233486f _ZN2CA7Display11DisplayLink8dispatchEyy + 166
10 QuartzCore 0x323347c5 _ZN2CA7Display16IOMFBDisplayLink8callbackEP21__IOMobileFramebufferyyyPv + 60]
即。我的类和方法的名称都消失了,取而代之的是符号_mh_execute_header +< offset>。
我以为我错过了dSYM设置,但是对于发布和调试都是开启的,“条带调试符号”也是关闭的。
搜索了SO,但没有运气。请告诉我有什么问题?
答案 0 :(得分:1)
我的坏,我不熟悉象征性技术。 简而言之 - 为了象征堆栈跟踪,你需要dSYM包和xcode来用它的私有api来表示崩溃日志。也许下次我会写更多:仍然学习如何以最方便(对我来说)的方式来做。
编辑:一周过去了,我已经开发了一个解决方案。它是我的多平台生态系统特有的,但在这里它是如何工作的。应用程序崩溃并将包含所有所需数据的崩溃日志发送到我的服务器。当我想查看崩溃日志时,我在我的桌面上启动实用程序,从服务器下载所有堆栈(来自发布/ arm二进制文件),这些堆栈尚未被执行。接下来,它在Xcode Archives文件夹中找到相应的包(获取需要的uuids / vmaddr),然后计算堆栈行的实际地址(使用接收日志中的二进制vmaddr和_mh_execute_header地址)并为每个地址调用atos。然后它解析atos的输出,生成diff并将其发送回服务器。这样我就可以在基于php的bugtracker中看到符号化的堆栈。 这不是那么容易,就像在java中使用反混淆堆栈一样,但它仍然是可能的。
答案 1 :(得分:0)
您可以使用我编写的符号化工具快速对应用程序的地址进行符号化。
symbolication your.app.dSYM your.app.trace
符号化版本将打印到STDOUT。为获得最佳效果,请将.app保存在与.dSYM相同的文件夹中。