У меня есть следующий скрипт dtrace:
#!/usr/sbin/dtrace -Zs
#pragma D option quiet
php*:::function-entry {
printf("%Y: PHP function-entry :%*s%s %s%s%s() in %s:%d\n", walltimestamp, ++indent, "", "->", copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::function-return {
printf("%Y: PHP function-return:%*s%s %s%s%s() in %s:%d\n", walltimestamp, indent--, "", "<-", copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
который, кажется, работает для простого кода PHP, такого как:
<?php
function a() { b(); }
function b() { c(); }
function c() { d(); }
function d() { e(); }
function e() { }
a();
например:
$ sudo ./trace-php.d
2016 Apr 9 01:41:29: PHP function-entry : -> a() in foo.php:2
2016 Apr 9 01:41:29: PHP function-entry : -> b() in foo.php:3
2016 Apr 9 01:41:29: PHP function-entry : -> c() in foo.php:4
2016 Apr 9 01:41:29: PHP function-entry : -> d() in foo.php:5
2016 Apr 9 01:41:29: PHP function-entry : -> e() in foo.php:6
2016 Apr 9 01:41:29: PHP function-return: <- e() in foo.php:6
2016 Apr 9 01:41:29: PHP function-return: <- d() in foo.php:5
2016 Apr 9 01:41:29: PHP function-return: <- c() in foo.php:4
2016 Apr 9 01:41:29: PHP function-return: <- b() in foo.php:3
2016 Apr 9 01:41:29: PHP function-return: <- a() in foo.php:2
Однако, когда я тестирую его с помощью более сложных сценариев, например, Бег drush status
, php index.php
(на сайте Drupal), или используя встроенный PHP-сервер, он уходит с экрана на следующую строку и еще одну и не возвращается в то же место, поэтому через несколько минут у меня несколько сотен (даже тысяч) космические символы. И это не возможно, что код идет так глубоко, так как я xdebug.max_nesting_level=256
что предотвращает слишком глубокую рекурсию.
Что вызвало сбой вышеуказанной логики и как ее можно улучшить?
Задача ещё не решена.
Других решений пока нет …