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

前端之家收集整理的这篇文章主要介绍了如何在lldb中的实时运行脚本上转储PHP回溯?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在玩 LLDB (debugger),我做了以下实验.

>运行PHP脚本为:

PHP -r "sleep(1000);"

要么:

PHP -r "function r(){sleep(1000);}r();"

>在另一个控制台上,我直接从lldb调用zif_debug_backtrace():

echo 'call (void)zif_debug_backtrace()' | lldb -p $(pgrep -fn PHP)

以上工作,但是过程停止了以下警告:

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

我不太确定为什么脚本必须停止,我需要做什么才能实现透明度(不影响脚本)?

附:调用zif_debug_print_backtrace()和调用custom_backtrace()时显示的同样的事情:Backtrace null函数调用.我正在使用xdebug,如果这更改任何东西.

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

我只对lldb / gdb解决方案感兴趣,以打印回溯.

类似的方法在Ruby中有效,例如:

运行:ruby -e’sleep 1000′.
>在另一个终端:echo’call(void)rb_backtrace()’| lldb -p $(pgrep -nf ruby​​).

你不能调用这样的内部函数,内部函数期望像框架,返回值等等…不要这样做.

有一个.gdbinitPHP分发,其中有一个名为zbacktrace功能,您可以将其移植到lldb.

你可以做的另一件事,这很简单,只是调用生成跟踪的API函数,但是正确地调用它.

这里是GDB(PHP7):

define ztrace
    set $var = malloc(sizeof(zval))
    call zend_fetch_debug_backtrace($var,0)
    call PHP_var_dump($var,0)
    call _zval_ptr_dtor($var,0)
    call free($var)
end

document ztrace
    show a debug backtrace
end

而对于LLDB(PHP7):

(lldb) expr zval $var;
(lldb) expr zend_fetch_debug_backtrace(&$var,0)
(lldb) expr PHP_var_dump(&$var,0)
(lldb) expr _zval_ptr_dtor(&$var,0)

既然你问过,LLDB for PHP5.6(no-zts):

(lldb) expr zval *$zp = (zval*) malloc(sizeof(zval))
(lldb) expr zend_fetch_debug_backtrace($zp,0)
(lldb) expr PHP_var_dump(&$zp,0)
(lldb) expr _zval_ptr_dtor(&$zp,0)
(lldb) expr free($zp)

猜你在找的PHP相关文章