如何解决如何在iPad应用程序中循环遍历所有活动线程
| 在我正在创建的iPad应用中,我试图通过输出异常的callStackSymbols来处理未捕获的异常。可以用[NSException callStackSymbols]
完成
但是,我也希望能够在所有其他活动线程上看到callStackSymbols。我知道我可以在任何线程上使用[NSThread callStackSymbols]
,但是我需要遍历所有活动线程才能这样做。
这可能吗?
解决方法
正如Sedate Alien指出的,这是一个复杂的领域。您将需要实现自己的堆栈遍历,以从其他活动线程中检索堆栈跟踪。诸如backtrace(3)和+ [NSThread callStackSymbols]之类的API只会为当前线程生成一个backtrace。
由于我熟悉PLCrashReporter代码,因此仅将其用作示例:
要获取线程列表,您需要使用task_threads():https://opensource.plausible.coop/stash/projects/PLCR/repos/plcrashreporter/browse/Source/PLCrashLogWriter.m?at=refs%2Ftags %2F1.0#694
一旦有了线程列表,就可以通过thread_get_state()获取线程状态:https://opensource.plausible.coop/stash/projects/PLCR/repos/plcrashreporter/browse/Source/PLCrashFrameWalker_arm.c?at=refs% 2Ftags%2F1.0#73
使用线程状态,您可以遍历目标的堆栈:
https://opensource.plausible.coop/stash/projects/PLCR/repos/plcrashreporter/browse/Source/PLCrashFrameWalker_arm.c?at=refs%2Ftags%2F1.0#104
注意,所有这些代码都是有点不寻常,因为它在信号处理程序中执行并且被编写为异步安全的。如果您不熟悉信号处理方面的复杂性,那么这是一个很好的起点:http://www.mikeash.com/pyblog/friday-qa-2011-04-01-signal-handling.html
正确地实施这种事情是一个巨大的头痛。我真的建议您使用PLCrashReporter或基于它的产品之一(QuincyKit,HockeyApp,Atlassian JMC等)。
, 这似乎充满了危险,加倍了,所以如果您需要在这里寻求帮助。我可以建议PLCrashReporter吗?其列出的功能是:
实现为进程内完全异步安全的信号处理程序。
不会干扰gdb中的调试
处理未捕获的Objective-C异常和致命信号(SIGSEGV,SIGBUS等)
提供了所有活动线程的回溯。 (强调我自己)
提供崩溃线程的完整寄存器状态。
更好的是,看看QuincyKit,它是PLCrashReporter的非常方便的包装器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。