How to get a backtrace if rspec (or any other ruby process) hangs with no output

Posted . Visible to the public.

If rspec hangs with no output and you dont get a backtrace neither with --backtrace nor by just killing it with crtl-c,
you can put the following in your spec/spec_helper.rb:

puts "rspec pid: #{Process.pid}"

trap 'USR1' do
  threads = Thread.list

  puts
  puts "=" * 80
  puts "Received USR1 signal; printing all #{threads.count} thread backtraces."

  threads.each do |thr|
    description = thr == Thread.main ? "Main thread" : thr.inspect
    puts
    puts "#{description} backtrace: "
    puts thr.backtrace.join("\n")
  end

  puts "=" * 80
end

then kill the process with kill -USR1 <the pid> and you get the backtrace.

(source: https://github.com/rspec/rspec-rails/issues/1353#issuecomment-93173691 Show archive.org snapshot )

Profile picture of Martin Schaflitzl
Martin Schaflitzl
Last edit
Martin Schaflitzl
Keywords
freezes
License
Source code in this card is licensed under the MIT License.
Posted by Martin Schaflitzl to makandra dev (2019-06-27 09:29)