我在 PHP 项目中编写了自己的异常和错误处理程序。
但是,在进行开发时,除了我自己的处理之外,我还想让 XDebug 执行正常的“异常”和“错误”处理。
我发现如果我自己的错误处理程序返回 FALSE,我可以很容易地让 XDebug 继续执行“错误”处理。但我找不到一种方法来通过“异常”处理获得类似的效果。
我希望我可以手动调用 XDebug 函数。xdebug_print_function_stack() 是我能看到的最接近的东西,但它不会给出触发异常的真实堆栈跟踪。
根据 PHP 手册页,存在以下命令行选项:
--zend-extension file
-z file Load Zend extension file
Run Code Online (Sandbox Code Playgroud)
这大概意味着您可以通过这种方式将 xdebug 作为 zend 扩展加载,从而仅在您实际需要时才加载 Xdebug,这对我来说很有帮助,因为 xdebug 会严重减慢 Drupal 单元测试的速度,但我可能需要调试一些测试。
但是,以这种方式加载 Xdebug 似乎不起作用。
环境:MacOS 10.10、PHP 5.6.3-dev、Xdebug 2.2.5。
$> ls -l /usr/local/lib/php/extensions/debug-non-zts-20131226/xdebug.so
-rwxr-xr-x 1 root wheel 319276 Oct 24 13:45 /usr/local/lib/php/extensions/debug-non-zts-20131226/xdebug.so
$> grep xdebug /usr/local/etc/php/5.6/php.ini
zend_extension=/usr/local/lib/php/extensions/debug-non-zts-20131226/xdebug.so
$> php -v |grep -i xdebug
with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans
Run Code Online (Sandbox Code Playgroud)
很明显,当在php.ini文件中指定时,xdebug 会正确加载。当我注释掉 xdebug 行时,
> grep xdebug /usr/local/etc/php/5.6/php.ini
;zend_extension=/usr/local/lib/php/extensions/debug-non-zts-20131226/xdebug.so
Run Code Online (Sandbox Code Playgroud)
您可以看到它没有正确加载:
> php -i|grep -i xdebug
>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用 …
我有一个 PHP 函数,当我发现异常时会调用它。它接受该异常作为可选参数,因此可以出于调试目的显示它:
public static function notFound($resource, \Exception $exception = null) {
// [... normal error handling ...]
if (DEBUG && $exception != null) {
echo '<br><br><h2>Stacktrace:</h2>';
print_r($exception);
}
die();
}
Run Code Online (Sandbox Code Playgroud)
我想要的是以与 xdebug 显示未捕获的异常和警告相同的方式显示此异常(使用 CSS 和 HTML 样式,可能使用不同的配色方案)。像这样(由echo $exception->getTrace();):

如果我使用print_r($exception);我得到这个,它似乎至少包含一些 xdebug 所需的输出:

我试过echo $exception->xdebug_message;, var_dump($exception);, 和var_dump($exception->xdebug_message);,但都没有奏效。最后一个似乎是我想要的,但我无法让它正常工作:

有没有办法对捕获的异常使用 xdebug 样式?
当我尝试调试我的 Web 应用程序时,我正面临这个问题。无论我使用的是 127.0.0.1 还是本地主机,该页面都可以加载,但断点仅适用于 127.0.0.1。我正在使用 Intellij 和 MAMP。我的php.ini配置如下:
[xdebug]
zend_extension="/Applications/MAMP/bin/php/php5.6.10/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_port="9000"
xdebug.remote_log="/Applications/MAMP/xdebug_log.txt"
Run Code Online (Sandbox Code Playgroud)
我也尝试添加
xdebug.remote_host="localhost"
Run Code Online (Sandbox Code Playgroud)
但这没有区别,同样的问题仍然存在。我的主机文件如下:
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
Run Code Online (Sandbox Code Playgroud)
此外,当我想调试 html 页面时,我必须在主 php 文件上执行此操作,例如调试 index.html,我必须执行以下操作:
http://127.0.0.1/<the_folder>/index.php?xdebug_session_start=intellij
Run Code Online (Sandbox Code Playgroud)
有时它有效,有时它不起作用!我必须尝试几次才能使其正常工作。有时意味着尝试各种项目或尝试仅使用 Intellij 中的“调试”调试 php 脚本。我只添加了“PHP Script”配置,即单独调试php。也有这个“PHP Web 应用程序”配置......它做了我上面所做的,但没有解决我的问题。
总结: 1)为什么 xdebug 在解析“localhost”进行调试时有问题?2) 如何有效地调试我的 web 应用程序 html 文件中加载的 php 脚本?
我有一台带有 apache2 和 php7 的计算机,我将php.ini其设置为使用 xdebug 并且可以,我可以使用编辑器进行调试。
但是我想在另一台只有php的计算机上调试。
我使用以下方法启动服务器: php -S localhost:8080
我尝试使用相同的php.ini,但似乎 php 内置的网络服务器无法理解php.ini
我使用了命令: php -S localhost:8080 -c <<path to my php.ini>>
这里是 apache 服务器的 phpinfo 输出:
这里是内置网络服务器的输出:
我正在使用 VS Code 来调试我的 Laravel 项目。我已经安装了 PHP Debug 扩展并将 PHP 配置为使用 XDebug 进行调试。服务器是 Apache(使用 Xampp)。我可以使用浏览器访问我的网站,但是我使用 VS Code 在我的项目中设置的断点从未被命中?我在这里做错了什么?
我正在尝试使用 Xdebug 在 Visual Studio Code 上调试 Laravel 代码。我正在使用 Docker 容器作为服务器。
但我在尝试调试时收到此错误:
无法连接到运行时进程,10000 毫秒后超时 - (原因:无法连接到目标:连接 ECONNREFUSED 192.168.99.100:9000)。
这是我的 VSCodelaunch.json
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Docker: Attach to Node",
"port": 9000,
"address": "192.168.99.100",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/www",
"protocol": "inspector",
"restart": true
}
]
Run Code Online (Sandbox Code Playgroud)
这是docker-compose.yml
app:
build:
context: ./
dockerfile: .docker/app.dockerfile
args:
- INSTALL_XDEBUG=true
working_dir: /var/www
volumes:
- ./:/var/www
environment:
- "DB_PORT=33061"
- "DB_HOST=192.168.99.100"
- XDEBUG_CONFIG=remote_host=192.168.99.100 remote_port=9000 remote_connect_back=0
Run Code Online (Sandbox Code Playgroud)
这是我的app.dockerfile
FROM php:7.1-fpm
RUN docker-php-ext-install …Run Code Online (Sandbox Code Playgroud) 我已经在我自己的项目代码中设置了 PhpStorm 和 XDebug 并且运行良好。
但是,当我需要调试vendor文件夹中的某些内容时,PhpStorm 不会在断点处停止。
我该如何设置?
我尝试在我的计算机上安装 PHP 的 Xdebug 扩展(Linux Mint,PHP 版本 7.3.6)。
我已按照Xdebug 向导页面的说明进行操作。完成后,我在终端中运行了以下命令:
php --version
Run Code Online (Sandbox Code Playgroud)
它向我显示了我的 PHP 版本,但也显示了以下警告:
加载失败 /usr/lib/php/20180731/xdebug.so: /usr/lib/php/20180731/xdebug.so: 未定义符号: gc_globals
调用 phpinfo() 时,Xdebug 也未列为已启用的扩展。你能帮忙吗,我的 Xdebug 安装哪里有问题?
我已经使用向导页面中的以下步骤安装了 Xdebug:
• Download xdebug-2.7.2.tgz
• Install the pre-requisites for compiling PHP extensions.
• On your Ubuntu system, install them with: apt-get install php-dev autoconf automake
• Unpack the downloaded file with tar -xvzf xdebug-2.7.2.tgz
• Run: cd xdebug-2.7.2
• Run: phpize (See the FAQ if you don't have phpize).
•
• …Run Code Online (Sandbox Code Playgroud) 我尝试了很多方法,试图让 Xdebug 在 Docker 容器中工作。我接触到了这些资源:
我认为问题要么是我不理解的端口,要么是调试器会话未启动或识别。对于调试器会话,我还尝试安装一个设置 cookie 的浏览器扩展。
我最终至少拥有了单独的容器,其中一个作为启用了 Xdebug 的开发容器。
docker-compose.yml
version: "3"
services:
production:
build: .
ports:
- "8000:80"
volumes:
- .:/var/www/html
development:
build: .
ports:
- "8080:80"
# - "10000:80" also not working
volumes:
- .:/var/www/html
- ./dev.php.ini:/usr/local/etc/php/php.ini
Run Code Online (Sandbox Code Playgroud)
Dockerfile
FROM php:7.4.0-apache
RUN pecl install …Run Code Online (Sandbox Code Playgroud) xdebug ×10
php ×7
docker ×2
exception ×2
phpstorm ×2
breakpoints ×1
debugging ×1
installation ×1
laravel ×1
laravel-5 ×1