gpt4 book ai didi

php - 如何使用 gdb 在 php 脚本中设置断点

转载 作者:可可西里 更新时间:2023-10-31 23:56:49 24 4
gpt4 key购买 nike

我正在尝试使用 GDB 通过控制台调试 php 脚本,但我无法设置断点。这就是我所做的。我创建了一个包含以下内容的脚本:

<?php
echo "1";
echo "1";
echo "1";
echo "1";
echo "1";
echo "1";
echo "1";

这是我调试它的诱惑

# gdb php -d CANCELLAMI.php 
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...

warning: /root/CANCELLAMI.php is not a directory.
Reading symbols from /usr/bin/php...(no debugging symbols found)...done.

现在我在 gdb 中,我在第 2 行放置了一个断点。

(gdb) break CANCELLAMI.php:2
No symbol table is loaded. Use the "file" command.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (CANCELLAMI.php:2) pending.

但是如果我运行 CANCELLAMI 脚本

(gdb) run CANCELLAMI.php 
Starting program: /usr/bin/php CANCELLAMI.php
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
11111111[Inferior 1 (process 30216) exited normally]

整个脚本被执行。

最佳答案

您可以相对轻松地从 PHP 触发断点:

  1. 使用 configure --enable-debug 编译 PHP。
  2. 找到脚本不调用的方便的 PHP 函数。比如,hebrevc(或 quotemetaspl_autoload_extensions——要有创意,PHP 有很多功能)。在您要触发的位置添加调用。
  3. 接下来,启动 gdb 并在 zif_hebrevc 上放置一个断点。如果您阅读 PHP 源代码,您会发现
    1. PHP_FUNCTION(hebrevc)
    2. #define PHP_FUNCTION ZEND_FUNCTION
    3. 定义 ZEND_FUNCTION(名称) ZEND_NAMED_FUNCTION(ZEND_FN(名称))
    4. #define ZEND_FN(name) zif_##name
    5. #define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)

所以所有这些都导致 zif_hebrevc(或 zif_quotemetazif_spl_autoload_extensions)。

您可能需要 source/path/to/the/php/source/checkout/.gdbinit 这也是可选的,但没有它很难使用 PHP。此文件为您提供诸如 zbacktraceprintzvprint_ht 等命令。此 .gdbinit 的最佳文档是source .

最后,http://lxr.php.net/是您浏览 PHP 源代码的 friend 。

gdb start

关于php - 如何使用 gdb 在 php 脚本中设置断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30664274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com