在 Linux 中,我可以echo t > /proc/sysrq-trigger
用来转储系统中所有线程的内核调用堆栈。
Mac OS X 中是否有任何用于相同目的的方法?或任何方法来转储一个进程的内核堆栈?
Short answer: procexp 0 threads (as root) will do the trick, where procexp is "Process Explorer" from http://newosxbook.com/tools/procexp.html .
Slightly Longer answer: - Dtrace is overkill and will need SIP disablement - stackshot is deprecated since its underlying syscall (#365) was removed - A replacement, stack_snapshot_with_config(#491) can be used programmatically as well (this is what drives the above tool)
答案可能是 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 个用户态帧