首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在堆栈跟踪中截断长参数?

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

Stack Overflow用户
提问于 2022-02-04 14:00:24
回答 1查看 175关注 0票数 0

当内存耗尽时,我试图控制Xdebug的输出。我发现,如果一个非常长的字符串被传递给一个函数(然后内存随后耗尽),Xdebug将在堆栈跟踪中不截断地转储整个参数。

获取包含长字符串参数的堆栈跟踪的一些示例代码:

代码语言:javascript
复制
<?php
function doStuff( string $data ):void {
    if( strlen($data) > 20 ){
        throw new Exception('Too big!');
    }
}
doStuff( str_repeat('foo',20) );

PHP的正常堆栈跟踪来自未察觉的异常,如下所示:

代码语言:javascript
复制
Stack trace:
#0 /path/to/foo.php(7): doStuff('foofoofoofoofoo...')
#1 {main}

60字节的$data参数是整洁的截断为15个字符加上一个省略号。

但是要在内存耗尽后获得堆栈跟踪,我需要启用Xdebug。在启用Xdebug 3的情况下,我不会截断长参数;我得到了以下内容:

代码语言:javascript
复制
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设置,似乎无法控制它是如何显示的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-04 14:49:37

Xdebug为此设置了xdebug.var_display_max_data

$ cat /tmp/ff.php

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70987613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档