【发布时间】:2019-08-30 04:57:48
【问题描述】:
在 Linux 中,我可以使用echo t > /proc/sysrq-trigger 转储系统中所有线程的内核调用堆栈。
Mac OS X 中是否有任何用于相同目的的方法?或任何方法来转储一个进程的内核堆栈?
【问题讨论】:
在 Linux 中,我可以使用echo t > /proc/sysrq-trigger 转储系统中所有线程的内核调用堆栈。
Mac OS X 中是否有任何用于相同目的的方法?或任何方法来转储一个进程的内核堆栈?
【问题讨论】:
简答:procexp 0 个线程(以 root 身份)可以解决问题,其中 procexp 是来自 http://newosxbook.com/tools/procexp.html 的“进程资源管理器”。
略长的答案: - Dtrace 太过分了,需要禁用 SIP - stackshot 已被弃用,因为它的底层系统调用 (#365) 已被删除 - 替代品 stack_snapshot_with_config(#491) 也可以通过编程方式使用(这是驱动上述工具的原因)
【讨论】:
答案可能是 dtrace。我知道 Instruments.app(或 iprofiler)可以进行基于探测的分析,因此它需要定期堆栈跟踪。 (用户或内核;您的选择)据我所知,这一切都基于 dtrace,尽管我不太了解它,无法告诉您一种一次性跟踪的方法。
【讨论】:
嗯...我已经好几年没有在 Mac OS X 上编码了。但是一个名为“stackshot”的工具可以帮助你做到这一点。尝试谷歌它以获取使用情况。 :-)
【讨论】:
来自http://www.brendangregg.com/DTrace/DTrace-cheatsheet.pdf:
sudo dtrace -n 'fbt:::entry { stack(10); ustack(5) }'
打印 10 个内核框架、5 个用户级框架
【讨论】: