我正在按照以下步骤找到当前的PHP函数调用,如下所示:



运行虚拟脚本:

$ gdb -ex run --args php -r "sleep(10);"



按Ctrl + C返回gdb运行:

(gdb) bt full
#1  0x00007ffff6007dd4 in __sleep (seconds=0) at ../sysdeps/unix/sysv/linux/sleep.c:137
        ts = {tv_sec = 8, tv_nsec = 306649388}
        set = {__val = {65536, 0 <repeats 15 times>}}
        oset = {__val = {0, 4469319, 4294967295, 8081486, 140737319884960, 140737354070488, 15761488, 15454080, 15337134, 
            140737354001040, 0, 7307048, 16048064, 206158430232, 140737488342304, 140737488342096}}
        result = <optimized out>
#2  0x00000000006156ef in zif_sleep ()
No symbol table info available.
#3  0x00000000006ddd7b in dtrace_execute_internal ()
No symbol table info available.
#4  0x000000000079dde5 in ?? ()
No symbol table info available.
#5  0x0000000000717b18 in execute_ex ()
No symbol table info available.
#6  0x00000000006ddc79 in dtrace_execute_ex ()
No symbol table info available.
#7  0x00000000006e1b0a in zend_eval_stringl ()
No symbol table info available.
#8  0x00000000006e1bf9 in zend_eval_stringl_ex ()
...
(gdb) frame 2
#2  0x00000000006156ef in zif_sleep ()
(gdb) print (char *)(executor_globals.function_state_ptr->function)->common.function_name
Attempt to extract a component of a value that is not a structure.      
(gdb) print (char *)(executor_globals.function_state_ptr->function)
Attempt to extract a component of a value that is not a structure.
(gdb) print (char *)(executor_globals)
 = 0xffffffffffffcf48 <error: Cannot access memory at address 0xffffffffffffcf48>


所以executor_globals符号似乎不可用。是因为二进制文件已优化,还是我的框架错误或其他原因?还是应该改用lldb



评论

如果该符号不可用,则会收到有关未知符号的另一条错误消息。 (尝试打印(char *)(blarflgrumpf))。看来您的二进制文件已在优化的基础上进行了编译(这可能会将一些变量放入寄存器,而gdb却不知道,并依赖(错误的)堆栈值)。尝试用-O0和-g编译/链接php。另外,除非削减回溯的某些部分,否则堆栈可能会损坏,因为execute_ex似乎是凭空被调用的。堆栈破裂可能是各种意外行为的原因。
@GuntramBlohm谢谢,是的,在bt中有更多帧(使用??最多可以达到#10),我已经重新添加了。是的,未知符号正在打印不同的消息。因此,这意味着在不重新编译PHP的情况下无法访问/提取有关当前函数的数据吗?

好吧,有些事情对我来说似乎有些混乱:指令告诉您将框架移至上一个执行调用,而您只有execute_ex;如果executor_globals确实是全局变量,则堆栈框架无关紧要,但是如果它是局部变量,则不应在zif_sleep框架中找到它。我想知道您链接到该网站的最新信息。但是由于executor_globals的值是错误的,并且您的PHP站点显示“重要!要获得正确信息的回溯,必须使用--enable-debug!配置PHP!”,我认为您需要重新编译。

高度相关的stackoverflow.com/a/31240030/308851

#1 楼

根据此链接,应该可以通过以下步骤找到正在使用的函数:


将gdb附加到当前正在运行的PHP进程:gdb -p <processid>

为您的PHP版本加载PHP .gdbinit文件(可从此处下载)
使用zbacktrace命令显示当前正在运行的PHP脚本

例如:

gdb -p 4584
(gdb) source PHP_5_5/.gdbinit
(gdb) zbacktrace
[0xec906090] addOne() /tmp/yourscript.php:9


评论


太棒了! 2.中指向.gdbinit文件的链接很有帮助!谢谢!

–AnnaVölkl
17年5月16日在17:57

该链接对我安装php5-cli-dbgsym wiki.ubuntu.com/DebuggingProgramCrash也很有用

–山本彰(Akira Yamamoto)
18年8月9日在1:43