Ich spiele mit LLDB (debugger) herum und ich habe das folgende Experiment gemacht.Wie PHP-Backtrace auf Live-Skript in lldb Dump dump?
Run PHP-Skript als:
php -r "sleep(1000);"
oder:
echo 'call (void)zif_debug_backtrace()' | lldb -p $(pgrep -fn php)
php -r "function r(){sleep(1000);}r();"
auf einer anderen Konsole habe ich direkt zif_debug_backtrace()
von lldb
genannt
oben gearbeitet, aber der Prozess mit der folgenden Warnung gestoppt:
Warning: sleep() expects at most 2 parameters, 1606408648 given in Command line code on line 1
Call Stack:
0.0016 235152 1. {main}() Command line code:0
0.0021 235248 2. sleep(1000) Command line code:1
Ich bin nicht ganz sicher, warum das Skript zu stoppen hatte und was ich tun muß, um Transparenz zu erreichen (ohne das Skript zu beeinflussen)?
P.S. Das selbe passiert, wenn zif_debug_print_backtrace()
aufgerufen wird und custom_backtrace()
es zeigt: Backtrace null function called
. Ich benutze xdebug
, wenn das etwas ändert.
Vielleicht muss ich eine andere Funktion wie zend_fetch_debug_backtrace
aufrufen (siehe: image dump symtab
)? Oder verwenden Sie die richtigen Argumente, wenn ja, welche?
Ich bin nur an lldb
/gdb
Lösungen interessiert, um das Backtrace zu drucken.
ähnlicher Ansatz funktioniert in Ruby, z.B .:
- Run:
ruby -e 'sleep 1000'
. - In einem anderen Terminal:
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
.
Danke für die Antwort. Ich habe getestet und es tötet immer noch den ursprünglichen Prozess, also funktioniert es im Prinzip genauso. Irgendeine Chance, dass es den ursprünglichen Prozess nicht tötet? – kenorb
Ich glaube nicht, dass dies vermieden werden kann. PHP ist single threaded. Wenn Sie also einen Befehl extern ausführen möchten, müssen Sie das Skript stoppen. – akirk
Es funktioniert in Ruby: 'Ruby -e 'Schlaf 1000'', und' Echo' Aufruf (void) rb_backtrace() '| lldb -p $ (pgrep -nf ruby) '. – kenorb