debugging - How to dump PHP backtrace on live running script in lldb? -
i'm playing around lldb (debugger) , did following experiment.
run php script as:
php -r "sleep(1000);"or:
php -r "function r(){sleep(1000);}r();"on console, i've called directly
zif_debug_backtrace()lldb:echo 'call (void)zif_debug_backtrace()' | lldb -p $(pgrep -fn php)
above worked, process stopped following warning:
warning: sleep() expects @ 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 i'm not quite sure why script had stop , need achieve transparency (without affecting script)?
p.s. same happening when calling zif_debug_print_backtrace() , when calling custom_backtrace() showing: backtrace null function called. i'm using xdebug if change anything.
maybe need call different function zend_fetch_debug_backtrace (see: image dump symtab)? or use right arguments, if so, one?
i'm interested in lldb/gdb solutions in order print backtrace.
similar approach works in ruby, e.g.:
- run:
ruby -e 'sleep 1000'. - in terminal:
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby).
you can't call internal functions that, internal functions expect things frame, return value , on ... don't' it.
there .gdbinit distributed php, in there function named zbacktrace, port lldb.
another thing do, easier, call api function generates trace, call properly.
here gdb (php7):
define ztrace set $var = malloc(sizeof(zval)) call zend_fetch_debug_backtrace($var, 0, 0, 0) call php_var_dump($var, 0) call _zval_ptr_dtor($var, 0, 0) call free($var) end document ztrace show debug backtrace end and lldb (php7):
(lldb) expr zval $var; (lldb) expr zend_fetch_debug_backtrace(&$var, 0, 0, 0) (lldb) expr php_var_dump(&$var, 0) (lldb) expr _zval_ptr_dtor(&$var, 0, 0) since asked, lldb php5.6 (no-zts):
(lldb) expr zval *$zp = (zval*) malloc(sizeof(zval)) (lldb) expr zend_fetch_debug_backtrace($zp, 0, 0, 0) (lldb) expr php_var_dump(&$zp, 0) (lldb) expr _zval_ptr_dtor(&$zp, 0, 0) (lldb) expr free($zp)
Comments
Post a Comment