如何在堆栈跟踪中截断长参数



当内存耗尽时,我试图控制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。启用Xdebug3后,我不会截断长参数;我得到这个:

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

相关内容

  • 没有找到相关文章

最新更新