2017-05-27 6 views
0

Wie bekomme ich mein Programm, um das Backtrace/Anrufer anzuzeigen, wenn getötet?
Ich habe ein Problem mit einer Endlos-Schleife in einem Juwel, das nicht von dir und muß wissen, wo das Problem ist, ist esRuby-Display-Backtrace beim Tod

def hello 
    puts 'hello' 
end 

def test 
    while true 
    sleep 2 
    hello 
    end 
end 

test 

In diesem exemple zu melden, wenn ein Kill-Signal an das Programm gesendet wird, ich möchte wissen, was das Programm, was zu tun (der Anrufer angezeigt werden)
zur Zeit alles, was ich bekommen angezeigt „getötet“ auf den Ausgang

+1

ich würde versuchen, 'at_exit {setzt caller.inspect}' vielleicht hilft es – slowjack2k

+0

dank versuchen –

+0

nein, es funktioniert nicht, ich habe nur noch Erhalten Sie eine "Killed" Zeichenfolge angezeigt auf dem Begriff, und das ist alles –

Antwort

1

Es ist nicht möglich, SIGKILL Signale zu fangen, wie sie an den Kernel und den Prozess nicht gesendet werden: https://major.io/2010/03/18/sigterm-vs-sigkill/

Sie können jedoch einen „Eltern“ verwenden Prozess, der die „Kinder“ Uhren und werden entsprechend reagieren SIGKILL signal Handler

Das bedeutet, dass ich das Backtrace nicht anzeigen kann, werde ich wahrscheinlich eine Protokolldatei oder etwas ähnliches verwenden müssen.

Ich nehme an Anti-Viren haben eine andere Art zu arbeiten, die Frage zu vermeiden

getötet
+0

Für Linux sprechen. Nur der Benutzer mit einer echten oder effektiven Benutzerkennung des Prozesses oder Root kann ein Signal an einen Prozess senden. Für Ihre Antivirensoftware ist also alles in Ordnung. – slowjack2k

1

ich Sie ein Signal fangen erraten müssen, Haben Sie versucht,

https://gist.github.com/sauloperez/6592971

+0

Das ist genau das, was ich vorschlagen würde :) es ist die Ruby Art, es zu tun. – zee

+0

funktioniert nicht mit sigkill:/(versuche, eine Schleife auszuführen, nachdem das Signal abgefangen wurde und ein sigkill-Signal mit htop gesendet wurde) –

1

Entnommen https://robots.thoughtbot.com/using-gdb-to-inspect-a-running-ruby-process

Als letzt Sie gdb verwenden können, um Ihren laufenden Ruby-Prozess zu verbinden gdb </path/to/ruby> <PID>

# inside ~/.gdbinit 
define redirect_stdout 
    call rb_eval_string("$_old_stdout, $stdout = $stdout, 
    File.open('/tmp/ruby-debug.' + Process.pid.to_s, 'a'); $stdout.sync = true") 
end 

define ruby_eval 
    call(rb_p(rb_eval_string_protect($arg0,(int*)0))) 
end 
Verwandte Themen