脚本结束,分析,解决方案后,Ruby进程是100%?

时间:2012-03-25 00:39:53

标签: ruby gdb profiling nokogiri

更新:问题位于我的相关问题中 - Nokogiri performance problem

我的程序存在严重问题。程序到达最后一个语句后,Aptana工作室显示程序即使在最后一行评估后仍在运行。 Ruby进程(在脚本的最后一行之后)仍然以100%的CPU使用率运行,它在几秒钟后结束(可能是15-30)。我试图至少看看问题出在哪里,但经过很长一段时间我还在开始。所以问题是,什么可能导致这个问题,我怎么能至少看到问题出在哪里,我的选择是什么?一些其他信息:

Aptana debbug模式:在最后一行之后,这将显示在Debug窗口中:     <terminated, exit value: 0>path/to/ruby 但Ruby进程仍在运行并使用100%CPU

我试图使用gdb来配置Ruby进程本身,但最终没有使用此处描述的方法:Profilig using gdb。我正在使用debian squeeze 64-bit,我尝试了两个版本的脚本(8,12> 16,24)。当我试图得到一些堆栈信息时,我得到了这个:

Program received signal SIGSEGV, Segmentation fault.
0x00007f20539a80b8 in ?? () from /lib/libc.so.6
/home/giron/programovani/gdb_init.sh:1: Error in sourced command file:
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on".
Evaluation of the expression containing the function
(backtrace) will be abandoned.
When the function is done executing, GDB will silently stop.

在我退出gdb之后,以下输出显示在Aptana控制台中(但这可能绝对没用,可能gdb做了这个,我不知道):

/home/giron/Aptana Studio 3 Workspace/RedisXmlConcept/bin/main.rb: [BUG] Segmentation fault
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]

-- control frame ----------
c:0001 p:0000 s:0002 b:0002 l:000f68 d:000f68 TOP   
---------------------------

-- C level backtrace information -------------------------------------------
/home/giron/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(rb_vm_bugreport+0x5f)[0x7f205488216f]
/home/giron/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x63274) [0x7f205476a274]
/home/giron/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(rb_bug+0xb3) [0x7f205476a413]
/home/giron/.rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x10c215) [0x7f2054813215]
/lib/libpthread.so.0(+0xeff0) [0x7f20544f9ff0]
/lib/libc.so.6(+0xe40b8) [0x7f20539a80b8]
/lib/libgcc_s.so.1(_Unwind_Backtrace+0x49) [0x7f2050d5b599]
/lib/libc.so.6(backtrace+0x4e) [0x7f20539a81ae]
/home/giron/.rvm/rubies/ruby-1.9.2-p290/bin/ruby(_start+0) [0x400890]

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

为了确保我已经很好地描述了问题,最后一行代码(在此之前,Nokogiri解析并使用Redis数据库完成):

puts "End"

结束打印出来,此Ruby过程将消耗100%的CPU几秒钟

这个问题与我之前的问题有关:Nokogiri performance problem这里有更多的代码片段,但由于我专注于这里的不同方法(分析Ruby),我创造了新的问题。

提前感谢您的任何提示,我现在几乎无能为力。

1 个答案:

答案 0 :(得分:1)

  

我试图使用gdb来配置Ruby进程本身

不要那样做。在您执行的上下文中调用backtrace可能不安全,并且(显然)会导致您的程序SIGSEGV

相反,只需将gdb附加到Ruby进程,然后执行thread apply all where命令。使用输出更新您的问题,您可能会得到更好的答案。