我的应用程序是用objective c和c++编写的。我使用的是Xcode4.5,当然我有开发者帐号,我的设备没有越狱,我已经在我的开发者帐号中设置好了一切。我没有使用xcode中的“设备日志”,而是实现了信号/异常处理程序来将堆栈跟踪写入文件,并在下次应用程序启动时将其发送到我的when服务器。
为了在崩溃时获得堆栈跟踪,我使用NSException callStackSymbols。它起作用了。因此,当我像这样做示例crash时:
NSArray *arr=[NSArray array];
[arr objectAtIndex:100];在xcode中调试并从设备上的xcode应用程序启动时,我得到:
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 + 60MyApp、c++和objc类和方法都用ok符号表示。
但是当我创建AdHoc ipa,并在其中执行同样的crach时,我得到:
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+。
我想我已经错过了dSYM设置,但它在发布和调试时都是打开的,“带调试符号”也是关闭的。
已经在上面找过了,但没找到。请告诉我出什么事了?
发布于 2012-09-29 09:08:28
我的错,我不熟悉符号技术。简而言之,要符号化堆栈跟踪,您需要使用包的dSYM和xcode来使用其私有api来符号化崩溃日志。也许下一次我会写更多:仍然在学习如何以最方便的方式(对我来说)做到这一点。
编辑:一周过去了,我开发了一个解决方案。它特定于我的多平台生态系统,但这里简单介绍一下它是如何工作的。应用程序崩溃,并发送崩溃日志与所有需要的数据到我的服务器。当我想要查看崩溃日志时,我在我的桌面上启动实用程序,它从服务器下载所有堆栈(从release/arm二进制文件),这些堆栈还没有被处理。接下来,它在Xcode Archives文件夹中找到相应的包(获取所需的arch所需的uuid/ vmaddr ),然后计算堆栈行的实际地址(使用二进制vmaddr和接收到的日志中的_mh_execute_header地址),并为每个地址调用atos。然后,它解析atos的输出,生成diff并将其发送回服务器。这样我就可以在基于php的bugtracker中看到符号化的堆栈。这并不像在java中获得去模糊的堆栈那样简单,但它仍然是可能的。
发布于 2012-10-19 20:18:00
你可以使用我写的这个符号化工具来快速符号化你的应用程序的地址。
symbolication your.app.dSYM your.app.trace符号化版本将打印到STDOUT。为了获得最佳效果,请将.app与.dSYM放在同一文件夹中。
https://stackoverflow.com/questions/12611068
复制相似问题