2011-01-31 24 views
3

我们有一个相当大的Rails应用程序,我已经开始在我们的unicorn.log输出:发现在Ruby代码寄生放

 
#:0xc644248>#:0xc644248>#:0xc4f06e4>#:0xc4f06e4>#:0xca481b4>#:0xca481b4>#:0xc53f604>#:0xc53f604>#:0xcd7a60c>#:0xcd7a60c>#:0xc5df2f8>#:0xc5df2f8>#:0xc69fd00>#:0xc69fd00>#:0xc560ae8>#:0xc560ae8> 

在我看来,像有可能是一个流浪Kernel.puts方法打电话到某个地方,但我一直在寻找几个小时,找不到它。

任何人有跟踪这样的事情的提示?

+0

由于输出不包含任何换行符,我开始认为这是一个打印电话,而不是放置。 – 2011-01-31 18:24:31

+0

这也可能是对pp的调用,它似乎无法通过打印或将 – 2011-01-31 18:33:09

回答

2

您是否检查过display?这是另一种打印出来的方法。

8

你可以猴子补丁放置,并在被调用时引发异常。你甚至可以用你的输出字符串上的正则表达式匹配(它看起来像递归对象转储)。

module Kernel 
    def puts (s) 
    raise "puts called, check the backtrace for the source" if s =~ /#:[a-z0-9]>*/ 
    end 
end 

它也可能是它不是一个调用put,而是#inspect。

+1

+1。这是一个非常好的解决方案。 – 2011-01-31 14:34:41

1

你可以去了所有的文件,搜索到Kernel.puts任何电话,就像这样:

find -iname "*.rb" | xargs grep -iR 'Kernel.puts' 

然而,整洁和效力方面,我可能会去提供的解决方案由Jeff Paquette提供。

0

这是我使用的,它与Banang的答案类似,但可能更简单。从这样的目录做一个grep:

grep -rn'puts'。

当然,它会搜索所有内容,但是您可以在任何您想限制的目录中运行它。这应该给你你需要的文件和行号。您可以根据需要微调搜索条件。