如何打印Ruby 1.9进程的运行时堆栈跟踪?

时间:2011-12-05 06:54:18

标签: ruby unix ruby-1.9

有没有办法打印Ruby 1.9.x进程的运行时堆栈跟踪?我知道Ruby 1.8中有一个名为pstack的实用程序,但该项目似乎在几年前就被放弃了:https://github.com/ice799/pstack。 Ruby 1.9是否存在类似的内容?非常感谢!

编辑:我对使用外部工具生成堆栈跟踪感兴趣(不在与Ruby进程相同的内存空间中运行)。

正如@mosch指出的那样,Kernal#caller方法在正在运行的Ruby进程中起作用。

您甚至可以构建对Ruby代码的支持,以捕获进程信号并打印堆栈跟踪:

Signal.trap("SIGTERM") { p caller }

参考:http://www.ruby-doc.org/core-1.9.3/Signal.html

我可以在我的代码中构建这个功能,但我更喜欢使用更通用的外部解决方案。感谢。

2 个答案:

答案 0 :(得分:3)

每当调用内核方法caller时,您将把当前的调用堆栈作为数组。

答案 1 :(得分:0)

我今天提出了一个想法。来自ice799的pstack利用gdb来调用ruby内部函数来转储回溯。但是,它不适用于1.9并且需要补丁。这不方便。

幸运的是,我们有hotpatch这个强大的工具。它可以为正在运行的进程注入一个.so,我们可以通过.so注入添加所需的函数,pstack将完成所有其余的工作。当然注入的.so需要与运行的ruby核心二进制兼容,但我们可以假设这部分现在非常稳定。