我在Ruby应用程序中具有以下2个堆栈跟踪。
第一个堆栈跟踪显示了在我的http.rb文件的第161行抛出的异常。在第161行,有一个对 puts()的调用,正如您在异常下方的代码段中所见。堆栈跟踪还显示了对 write()的调用,我认为这是一个低级C调用。第二个堆栈跟踪也用于 puts(),但在应用程序的不同部分中。这行实际上只是temporay调试信息。在这里,您可以看到我们正在使用Monitor来同步某些日志记录,因为它是一个多线程应用程序。
但是,该异常是Net :: OpenTimeout异常。我在其他地方确实有执行网络连接的代码,并且在其他地方有一个异常处理程序可以捕获它们。
调用“ puts”如何导致Net :: Timeout异常?
文件描述符会发生一些有趣的事情吗?
Net :: OpenTimeout ,“执行到期”,“ [\” / Users / tomburnell / github / lemonitor / lib / monitoring / checks / http.rb:161:in '写'\“, \“ / Users / tomburnell / github / lemonitor / lib / monitoring / checks / http.rb:161:in '投放'\“, \“ / Users / tomburnell / github / lemonitor / lib / monitoring / checks / http.rb:161:in 'puts'\“, \“ / Users / tomburnell / github / lemonitor / lib / monitoring / checks / http.rb:161:in 'logResult'\“, \“ / Users / tomburnell / github / lemonitor / lib / monitoring / checks / generic.rb:65:in '在call_check中营救'\“, \“ / Users / tomburnell / github / lemonitor / lib / monitoring / checks / generic.rb:63:in 'call_check'\“, \“ / Users / tomburnell / github / lemonitor / lib / monitoring / checks / generic.rb:46:in “按计划阻止” \“, \“ / Users / tomburnell / .gem / gems / rufus-scheduler-3.5.2 / lib / rufus / scheduler / jobs.rb:218:in 'do_call'\“, \“ / Users / tomburnell / .gem / gems / rufus-scheduler-3.5.2 / lib / rufus / scheduler / jobs.rb:262:in 'trigger_now'\“, \“ / Users / tomburnell / .gem / gems / rufus-scheduler-3.5.2 / lib / rufus / scheduler / jobs.rb:307:in '在start_work_thread中阻止(3级)'“, \“ / Users / tomburnell / .gem / gems / rufus-scheduler-3.5.2 / lib / rufus / scheduler / jobs.rb:310:in '在start_work_thread中阻止(2级)'“, \“ / Users / tomburnell / .gem / gems / rufus-scheduler-3.5.2 / lib / rufus / scheduler / jobs.rb:296:in '环'\”, \“ / Users / tomburnell / .gem / gems / rufus-scheduler-3.5.2 / lib / rufus / scheduler / jobs.rb:296:in '在start_work_thread中阻止'\“]”,
if !passed && @@previous_double_check.key?(@key) && !@@previous_double_check[@key]
puts "#{@key} failed after double check"
_passed=false
elsif !passed
puts "#{@key} first attempt failed, but marking true" # line 161
opts[:failedPendingDoubleCheck] = true
_passed=true
end
Net :: OpenTimeout,“执行已过期”, “ [\” lib / monitoring / monitor.rb:209:在
write'\", \"lib/monitoring/monitor.rb:209:in
中输入“ \”, \“ lib / monitoring / monitor.rb:209:在do_check'\的puts'\", \"lib/monitoring/monitor.rb:209:in
块(2个级别)中, \“ lib / monitoring / monitor.rb:208:在synchronize'\", \"lib/monitoring/monitor.rb:208:in
的do_check中阻止\”, \“ / Users / tomburnell / github / lemonitor / lib / monitoring / checks / generic.rb:93:inlogResult'\", \"/Users/tomburnell/github/lemonitor/lib/monitoring/checks/http.rb:170:in
logResult'\“, \“ / Users / tomburnell / github / lemonitor / lib / monitoring / checks / generic.rb:65:inrescue in call_check'\", \"/Users/tomburnell/github/lemonitor/lib/monitoring/checks/generic.rb:63:in
call_check'\“, \“ / Users / tomburnell / github / lemonitor / lib / monitoring / checks / generic.rb:46:inblock in schedule'\", \"/Users/tomburnell/.gem/gems/rufus-scheduler-3.5.2/lib/rufus/scheduler/jobs.rb:218:in
do_call'\“, \“ / Users / tomburnell / .gem / gems / rufus-scheduler-3.5.2 / lib / rufus / scheduler / jobs.rb:262:in 在start_work_thread'\“中trigger_now'\", \"/Users/tomburnell/.gem/gems/rufus-scheduler-3.5.2/lib/rufus/scheduler/jobs.rb:307:in
阻止(3个级别), \“ / Users / tomburnell / .gem / gems / rufus-scheduler-3.5.2 / lib / rufus / scheduler / jobs.rb:310:inblock (2 levels) in start_work_thread'\", \"/Users/tomburnell/.gem/gems/rufus-scheduler-3.5.2/lib/rufus/scheduler/jobs.rb:296:in
循环“ \”, \“ / Users / tomburnell / .gem / gems / rufus-scheduler-3.5.2 / lib / rufus / scheduler / jobs.rb:296:in `start_work_thread中的块'\“]”,70196180003060]
logger[:result] = lambda do |type, passed, opts|
$logger_mutex.synchronize do
puts "LOGGING RESULT " + Thread.current.object_id.to_s # line 209
log_event "METRIC ns=hc.check type=#{type} result=#{passed ? 'ok':'fail'} key=#{key.join('/').to_json} #{opts.map{|k,v|"#{k}=#{safe_to_json(v)}" if k and v}.compact.join(' ')}"
$last_result = passed;
puts "POST LOGGING RESULT " + Thread.current.object_id.to_s
end
end
线程#92,停止原因=信号SIGSTOP 框架#0:0x00007fff68cb8a16 libsystem_kernel.dylib
__psynch_cvwait + 10 frame #1: 0x00007fff68e81589 libsystem_pthread.dylib
_ pthread_cond_wait + 732 帧#2:0x000000010e3bb179 libruby.2.6.dylibgvl_acquire_common [inlined] native_cond_timedwait(cond=<unavailable>, mutex=<unavailable>) at thread_pthread.c:529 frame #3: 0x000000010e3bb13a libruby.2.6.dylib
gvl_acquire_common [内联] do_gvl_timer(vm =,th =)在 thread_pthread.c:219 帧#4:0x000000010e3bb0eb libruby.2.6.dylibgvl_acquire_common(vm=0x00007fdcbb801c00, th=0x00007fdcc0e1b8e0) at thread_pthread.c:253 frame #5: 0x000000010e3b2ed1 libruby.2.6.dylib
blocking_region_end [inlined] gvl_acquire(vm = 0x00007fdcbb801c00,th =)位于 thread_pthread.c:282 框架#6:0x000000010e3b2eb5 libruby.2.6.dylibblocking_region_end(th=0x00007fdcc0e1b8e0, region=0x000070000b8f34b0) at thread.c:1415 frame #7: 0x000000010e3b2a70 libruby.2.6.dylib
rb_thread_io_blocking_region(func =(libruby.2.6.dylibinternal_writev_func at io.c:1025), data1=0x000070000b8f3688, fd=<unavailable>) at thread.c:1566 frame #8: 0x000000010e2a927f libruby.2.6.dylib
io_fwritev [inlined] rb_writev_internal(fd =,iov =, iovcnt =)在io.c:1078 框架#9:0x000000010e2a9264 libruby.2.6.dylibio_fwritev [inlined] io_binwritev(iov=<unavailable>, iovcnt=<unavailable>, fptr=<unavailable>) at io.c:1614 frame #10: 0x000000010e2a8fef libruby.2.6.dylib
io_fwritev(argc =,argv =, fptr = 0x00007fdcbb531370)在io.c:1678 框架11:0x000000010e299de5 libruby.2.6.dylibio_writev(argc=2, argv=0x000070000b8f38c0, io=<unavailable>) at io.c:1723 frame #12: 0x000000010e3f42cc libruby.2.6.dylib
vm_call0_body位于vm_eval.c:86 框架#13:0x000000010e3f41f7 libruby.2.6.dylibvm_call0_body [inlined] vm_call0_cfunc(ec=0x00007fdcc0e4c668, argv=0x000070000b8f38c0) at vm_eval.c:100 frame #14: 0x000000010e3f41f7 libruby.2.6.dylib
vm_call0_body(ec = 0x00007fdcc0e4c668, 调用=,ci =,cc =, argv = 0x000070000b8f38c0)在vm_eval.c:131 框架15:0x000000010e3f2740 libruby.2.6.dylibrb_funcallv [inlined] rb_vm_call0(ec=<unavailable>, recv=<unavailable>, id=<unavailable>, argc=2, argv=<unavailable>, me =<unavailable>) at vm_eval.c:60 frame #16: 0x000000010e3f270d libruby.2.6.dylib
rb_funcallv [inlined] rb_call0(ec = 0x00007fdcc0e4c668,recv = 140586015886600, mid = 8481,argc = 2,argv =,scope = CALL_FCALL, self = 140586015886600)在vm_eval.c:308 框架#17:0x000000010e3f26f7 libruby.2.6.dylibrb_funcallv [inlined] rb_call(recv=140586015886600, mid=8481, argc=2, argv=0x0000000000000000, scope=CALL_FCALL) at vm_eval.c:601 frame #18: 0x000000010e3f26f7 libruby.2.6.dylib
rb_funcallv(recv = 140586015886600,mid = 8481,argc = 2, argv =)在vm_eval.c:823 框架#19:0x000000010e299813 libruby.2.6.dylibrb_io_puts(argc=<unavailable>, argv=0x0000000116750320, out=<unavailable>) at io.c:7756 frame #20: 0x000000010e3f42cc libruby.2.6.dylib
vm_call0_body位于vm_eval.c:86 框架#21:0x000000010e3f41f7 libruby.2.6.dylibvm_call0_body [inlined] vm_call0_cfunc(ec=0x00007fdcc0e4c668, argv=0x0000000116750320) at vm_eval.c:100 frame #22: 0x000000010e3f41f7 libruby.2.6.dylib
vm_call0_body(ec = 0x00007fdcc0e4c668, 调用=,ci =,cc =, argv = 0x0000000116750320)在vm_eval.c:131 框架#23:0x000000010e3f2740 libruby.2.6.dylibrb_funcallv [inlined] rb_vm_call0(ec=<unavailable>, recv=<unavailable>, id=<unavailable>, argc=1, argv=<unavailable>, me=<unavailable>) at vm_eval.c:60 frame #24: 0x000000010e3f270d libruby.2.6.dylib
rb_funcallv [inlined] rb_call0(ec = 0x00007fdcc0e4c668,recv = 140586015886600, mid = 16017,argc = 1,argv =,scope = CALL_FCALL, self = 140586015886600)在vm_eval.c:308 框架#25:0x000000010e3f26f7 libruby.2.6.dylibrb_funcallv [inlined] rb_call(recv=140586015886600, mid=16017, argc=1, argv=0x000070000b8f3a80, scope=CALL_FCALL) at vm_eval.c:601 frame #26: 0x000000010e3f26f7 libruby.2.6.dylib
rb_funcallv(recv = 140586015886600,mid = 16017,argc = 1, argv =)在vm_eval.c:823 框架#27:0x000000010e403311 libruby.2.6.dylibvm_call_cfunc [inlined] vm_call_cfunc_with_frame(ec=<unavailable>, reg_cfp=<unavailable>, ci=0x00007fdcbb56b0c0) at vm_insnhelper.c:1908 frame #28: 0x000000010e403224 libruby.2.6.dylib
vm_call_cfunc(ec =, reg_cfp =,调用=,ci = 0x00007fdcbb56b0c0, cc =)在vm_insnhelper.c:1924 框架#29:0x000000010e3e9adf libruby.2.6.dylibvm_exec_core(ec=<unavailable>, initial=<unavailable>) at insns.def:763 frame #30: 0x000000010e3fdd8e libruby.2.6.dylib
rb_vm_exec(ec = 0x00007fdcc0e4c668, mjit_enable_p =)在vm.c:0 框架#31:0x000000010e3f6fce libruby.2.6.dylib`rb_yield [内联] vm_yield at vm.c:1155