首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何象征OS应用程序的Hang?

如何象征OS应用程序的Hang?
EN

Stack Overflow用户
提问于 2014-12-15 11:05:40
回答 1查看 2.9K关注 0票数 4

我的一个应用程序(发布版)没有响应,所以我不得不强制-退出它。

OS提供了一个Hang (没有崩溃报告),我将其复制到一个*.crash文件中。

我知道我可以直接使用HockeyApp或atos之类的服务来象征崩溃报告,但是我如何才能为OS应用程序象征Hang呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-15 11:05:40

过了一段时间,我发现了如何处理Hang,这些报告与正常的崩溃报告略有不同。我所做的是:

  1. 在Xcode中,查找在组织者中崩溃的应用程序的相应存档,并在Finder中显示它(右击)。
  2. 右键单击存档并选择Show Package Contents
  3. *.app和相应的*.dSYM文件从Products复制到一个新文件夹中,例如在桌面上。新文件夹中将有一个MyApp.app和一个MyApp.app.dSYM。文件的命名很重要。
  4. ls通过终端进入新文件夹。

现在要使用atos工具(“将数字地址转换为二进制图像或进程的符号”),我们首先需要在运行时确定应用程序的加载地址,以及应用程序挂起时堆栈帧的地址。

  1. 打开Hang,并找到一条在Heaviest stack for ...行下面的地方写着Heaviest stack for ...的行。在我的例子中,这看起来类似于: 二进制图像:*0x107b0f000**- 0x108b59fff com.company.MyApp 1.1.0 (2) <6080DCE1-9086-311C-899F-CC22B32D694D> /应用程序/MyApp.app/Content/MacOS/MyApp0x7fff897e000- 0x7fff89c87fff libsystem_pthread.dylib (105.10.1) <3103AA7F3BAE-3673-9649-47FFD7E15C97>/usr/lib/system/libsystem_1.1.0/system/lib/ com.apple.AppKit _x7ff8bbbf0bf 000-0x7ff8bbf06f com.apple.AppKit (1344.36)/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7fff8bd6e000 - 0x7fff8c09cfff com.apple.Foundation 6.9 (1152.12) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation

被**包围的地址0x107b0f000是我们的加载地址,您应该复制它。

  1. 接下来,我们需要找到要查找符号信息的地址,即获取导致挂起的实际方法签名和代码行。因此,在Hang开头的堆栈中查找应用程序的名称,在“最重堆栈”下面: 目标进程主线程最重的堆栈: 10 start +1 (libdyld.dylib + 13769) 0x7fff91df35c9 10 NSApplicationMain + 1832 (AppKit + 10612) 0x7fff8b0c1974 10 -NSApplication run + 594 (AppKit + 95459) 0x7ffff8b0d64e3 10 -NSApplication + 194 (AppKit + 145072) 0x7ffff8b0e26b0 10 _DPSNextEvent + 964 (AppKit + 147201) 0xfff8b0e2f01 10 HIToolbox+ 71 (HIToolbox + 190347) 0x7fff96ae378b 10 ReceiveNextEventCommon + 431 (HIToolbox + 190794) 0x7fffae394aRunCurrentEventLoopInMode 10 RunCurrentEventLoopInMode + 235 + 191439)+ 296 ( __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 464984) 0x7fff901f1858 10 __CFRunLoopRun + 927 (CoreFoundation + 466495) 0x7fff901f1e3f10 __CFRunLoopDoSources0 + 269 (CoreFoundation + 469005) 0x7fff901f280d10+ 17 (CoreFoundation + 525953) 0x7fff90200681 10 __NSThreadPerformPerform + 293 (基金会+ 416988) 0x7fff8bdd3cdc 10?(MyApp + 62967) 0x108b1e5f7 8?(MyApp + 48600) 0x108b1add8 -IKImageBrowserView(ImageBrowserLayout) itemFrameAtIndex:+ 63 (ImageKit + 400983) 0x7fff91140e57

在这个示例堆栈跟踪的末尾,您会发现MyApp列出了两次。复制两个地址,0x108b1e5f70x108b1add8,并关闭报告。

  1. 现在我们已经准备好使用atos了。在终端中输入以下命令并按返回键: -o -arch x86_64 -l 0x107b0f000 0x108b1e5f7 0x108b1add8
  2. atos将使用同一个目录中的*.dSYM文件来象征无地址,并希望输出如下所示: -MainWindowController loadDidFinish: (MainWindowController.m:127) -MainWindowController view:stringForToolTip:point:userData: (MainWindowController.m:231)

太好了,看起来很有希望!如果atos输出与您放置的地址相同的地址,而不是代码行,那么有些地方出错了。错误的最主要来源可能是错误的内存地址,所以请确保您已经选择了正确的地址。

如果您还有其他问题(@raffael_me),请告诉我。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27482638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档