gpt4 book ai didi

iphone - 从另一个线程打印堆栈跟踪

转载 作者:太空狗 更新时间:2023-10-30 03:35:25 32 4
gpt4 key购买 nike

我知道我可以使用 backtrace() 或 [NSThread callStackSymbols] 获取当前线程的堆栈跟踪,但我如何获取不同线程的堆栈跟踪(假设它已被卡住)?

最佳答案

编辑:我的原始答案不会从任意线程打印出来。我已经在我的崩溃处理程序项目中编写了一个正确的实现:https://github.com/kstenerud/KSCrash

具体来说,这些文件:

在以下方面的帮助下:

你所做的是:

  • 制作一个新的机器上下文结构(_STRUCT_MCONTEXT)
  • 使用 thread_get_state() 填充其堆栈状态
  • 获取程序计数器(第一个堆栈跟踪条目)和帧指针(其余所有)
  • 遍历帧指针指向的堆栈帧,并将所有指令地址存储在缓冲区中以备后用。

请注意,您应该在执行此操作之前暂停线程,否则您可能会得到不可预知的结果。

堆栈帧由包含两个指针的结构填充:

  • 指向堆栈上一层的指针
  • 指令地址

因此,在遍历框架以填充堆栈跟踪时,您需要考虑到这一点。也有可能出现损坏的堆栈,导致错误的指针,这将使您的程序崩溃。您可以通过使用 vm_read_overwrite() 复制内存来解决这个问题,它首先询问内核是否可以访问内存,这样它就不会崩溃。

一旦你有了堆栈跟踪,你就可以像往常一样调用它的 backtrace() (崩溃处理程序必须是异步安全的,所以它实现了它自己的回溯方法,但在正常情况下 backtrace() 没问题)。

关于iphone - 从另一个线程打印堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4765158/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com