如何在lldb中的实时运行脚本上转储PHP回溯?

ken*_*orb 11 php debugging gdb debug-symbols lldb

我正在玩LLDB(调试器),我做了以下实验.

  1. 运行PHP脚本:

    php -r "sleep(1000);"
    
    Run Code Online (Sandbox Code Playgroud)

    要么:

    php -r "function r(){sleep(1000);}r();"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在另一个控制台上,我直接打电话zif_debug_backtrace()lldb:

    echo 'call (void)zif_debug_backtrace()' | lldb -p $(pgrep -fn php)
    
    Run Code Online (Sandbox Code Playgroud)

以上工作,但过程停止时出现以下警告:

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
Run Code Online (Sandbox Code Playgroud)

我不太清楚为什么脚本必须停止以及我需要做些什么来实现透明度(不影响脚本)?

PS同样的呼叫zif_debug_print_backtrace()和呼叫时发生的事情custom_backtrace()显示:Backtrace null function called.我正在使用,xdebug如果改变了什么.

也许我需要调用一个不同的函数zend_fetch_debug_backtrace(参见:) image dump symtab?或者使用正确的参数,如果是,哪一个?

我只对lldb/ gdbsolutions 感兴趣才能打印回溯.


类似的方法适用于Ruby,例如:

  1. 跑:ruby -e 'sleep 1000'.
  2. 在另一个终端:echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby).

Joe*_*ins 9

你不能像这样调用内部函数,内部函数需要像frame,return value等等......不要这样做.

有一个.gdbinit与php 一起发布,其中有一个名为zbacktrace的函数,你可以将它移植到lldb.

您可以做的另一件事情(可能更容易)就是调用生成跟踪的API函数,但要正确调用它.

这是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 a debug backtrace
end 
Run Code Online (Sandbox Code Playgroud)

而对于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)
Run Code Online (Sandbox Code Playgroud)

既然你问过LLDB for 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)
Run Code Online (Sandbox Code Playgroud)