PHP и юникод в стрэктрейсе

Какое-то время назад creocoder наткнулся на ????? вместо значения параметра в логах ошибок Yii. После анализа проблемы стало ясно, что нашёлся баг в PHP.

Exception::getTraceAsString и Exception::__toString не работают с юникодом в значениях параметров при построении stacktrace. В результате для
<?php
function test($arg){
    throw new Exception();
}
 
try {
    test('тест');
}
catch(Exception $e) {
    echo $e->getTraceAsString();
    echo (string)$e;
}

получаем
d:\web\usr\local\php54>php.exe d:\src\exception_wrong_trace\test.php
#0 D:\src\exception_wrong_trace\test.php(7): test('????')
#1 {main}exception 'Exception' in D:\src\exception_wrong_trace\test.php:3
Stack trace:
#0 D:\src\exception_wrong_trace\test.php(7): test('????')
#1 {main}

Обойти можно собрав строку руками на основе массива, полученного через Exception::getTrace.
Теги:
юникод, стрэктрейс
Добавлено: 17 Мая 2018 11:21:01 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...