如何截断堆栈跟踪中的长参数?
How to truncate long arguments in stack trace?
我试图在内存耗尽时控制 Xdebug 的输出。我发现如果将一个很长的字符串传递给一个函数(然后内存随后耗尽),Xdebug 会在不截断的情况下将整个参数转储到堆栈跟踪中。
获取包含长字符串参数的堆栈跟踪的一些示例代码:
<?php
function doStuff( string $data ):void {
if( strlen($data) > 20 ){
throw new Exception('Too big!');
}
}
doStuff( str_repeat('foo',20) );
PHP 来自未捕获异常的正常堆栈跟踪如下所示:
Stack trace:
#0 /path/to/foo.php(7): doStuff('foofoofoofoofoo...')
#1 {main}
60 字节的 $data
参数被巧妙地截断 为 15 个字符加一个省略号。
但要在内存耗尽后获取堆栈跟踪,我需要启用 Xdebug。启用 Xdebug 3 后,我不会截断长参数;我明白了:
PHP Stack trace:
PHP 1. {main}() /path/to/foo.php:0
PHP 2. doStuff($data = 'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo') /path/to/foo.php:7
要获得此输出,您必须设置 xdebug.show_exception_trace = On
。很容易看到真正的内存耗尽,但这对于发布可重现的代码很方便。跟踪格式与无法处理的错误相同。
我不是在问如何处理异常,或打印我自己的自定义堆栈跟踪。我在询问 Xdebug 在无法进行错误处理的情况下的默认输出。
我弄乱了许多 Xdebug 设置,似乎无法控制它的显示方式。
Xdebug 对此有 xdebug.var_display_max_data
设置:
$ cat /tmp/ff.php
function doStuff( string $data ):void {
if( strlen($data) > 20 ){
throw new Exception('Too big!');
}
}
doStuff( str_repeat('foo',20) );
$ php -dxdebug.var_display_max_data=16 /tmp/ff.php
Fatal error: Uncaught Exception: Too big! in /tmp/ff.php on line 4
Exception: Too big! in /tmp/ff.php on line 4
Call Stack:
0.0002 384152 1. {main}() /tmp/ff.php:0
0.0002 384280 2. doStuff($data = 'foofoofoofoofoof'...) /tmp/ff.php:7
我试图在内存耗尽时控制 Xdebug 的输出。我发现如果将一个很长的字符串传递给一个函数(然后内存随后耗尽),Xdebug 会在不截断的情况下将整个参数转储到堆栈跟踪中。
获取包含长字符串参数的堆栈跟踪的一些示例代码:
<?php
function doStuff( string $data ):void {
if( strlen($data) > 20 ){
throw new Exception('Too big!');
}
}
doStuff( str_repeat('foo',20) );
PHP 来自未捕获异常的正常堆栈跟踪如下所示:
Stack trace:
#0 /path/to/foo.php(7): doStuff('foofoofoofoofoo...')
#1 {main}
60 字节的 $data
参数被巧妙地截断 为 15 个字符加一个省略号。
但要在内存耗尽后获取堆栈跟踪,我需要启用 Xdebug。启用 Xdebug 3 后,我不会截断长参数;我明白了:
PHP Stack trace:
PHP 1. {main}() /path/to/foo.php:0
PHP 2. doStuff($data = 'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo') /path/to/foo.php:7
要获得此输出,您必须设置 xdebug.show_exception_trace = On
。很容易看到真正的内存耗尽,但这对于发布可重现的代码很方便。跟踪格式与无法处理的错误相同。
我不是在问如何处理异常,或打印我自己的自定义堆栈跟踪。我在询问 Xdebug 在无法进行错误处理的情况下的默认输出。
我弄乱了许多 Xdebug 设置,似乎无法控制它的显示方式。
Xdebug 对此有 xdebug.var_display_max_data
设置:
$ cat /tmp/ff.php
function doStuff( string $data ):void {
if( strlen($data) > 20 ){
throw new Exception('Too big!');
}
}
doStuff( str_repeat('foo',20) );
$ php -dxdebug.var_display_max_data=16 /tmp/ff.php
Fatal error: Uncaught Exception: Too big! in /tmp/ff.php on line 4
Exception: Too big! in /tmp/ff.php on line 4
Call Stack:
0.0002 384152 1. {main}() /tmp/ff.php:0
0.0002 384280 2. doStuff($data = 'foofoofoofoofoof'...) /tmp/ff.php:7