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

标签 php debugging gdb lldb debug-symbols

我正在玩弄 LLDB (debugger)我做了以下实验。

  1. 运行 PHP 脚本为:

    php -r "sleep(1000);"
    

    或:

    php -r "function r(){sleep(1000);}r();"
    
  2. 在另一个控制台上,我直接从 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 function called。如果有任何改变,我正在使用 xdebug

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

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


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

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

最佳答案

你不能那样调用内部函数,内部函数需要诸如框架、返回值等之类的东西……不要这样做。

有一个.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 

对于 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)

既然你问了,PHP5.6 的 LLDB(无 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)

关于php - 如何在 lldb 中的实时运行脚本上转储 PHP 回溯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31829082/

相关文章:

php - 如何使用 PHP 将 RSS XML 提要转换为数组

node.js - 如何在WebStorm中调试firebase云功能?

eclipse - 如何在 eclipse 中调试 Camunda webapps?

function - gdb,在文件中的所有函数上设置断点

python - GDB pretty-print : returning string from a children()'s iterator, 但显示为 char[]

php - 在某些条件下,如何更改 WooCommerce 结帐页面上的 "Your order"文本

php - MySQL查询没有结果

php - 从字符串中删除 url,但通过 php 在其中保留数据

python - 什么 python 可以仅使用对象自己的标签来告诉我有关对象的信息?

c - 我在哪里可以找到 libc 目标文件中的特定函数地址?