有没有办法打印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
我可以在我的代码中构建这个功能,但我更喜欢使用更通用的外部解决方案。感谢。
答案 0 :(得分:3)
每当调用内核方法caller
时,您将把当前的调用堆栈作为数组。
答案 1 :(得分:0)
我今天提出了一个想法。来自ice799的pstack利用gdb来调用ruby内部函数来转储回溯。但是,它不适用于1.9并且需要补丁。这不方便。
幸运的是,我们有hotpatch这个强大的工具。它可以为正在运行的进程注入一个.so,我们可以通过.so注入添加所需的函数,pstack将完成所有其余的工作。当然注入的.so需要与运行的ruby核心二进制兼容,但我们可以假设这部分现在非常稳定。