XDebugTrace panel
Panel používá xdebug_start_trace() a xdebug_stop_trace() k vygenerování trace logu funkcí, který následně parsuje, filtruje a zobrazí v tabulce.
| Verze | 0.3-beta3 |
|---|---|
| Repozitář | https://github.com/milo/XDebugTracePanel |
| Autor | © Miloslav Hůla (milo) 2011 |
| Licence | LGPL |
| Požadavky | XDebug 2.1.x, PHP 5.3+, Nette 2.0 beta |
| Diskuze | http://forum.nette.org/cs/9396-xdebugtrace-panel-trasovani-behu-funkci |
Ukázka
Instalace
XDebugTrace.phpa šablony uložte někam, kam má přístup RobotLoader, napříkladlibs/Panels/XDebugTrace/- V
bootstrap.phpzaregistrujte panel
// xdebug_start_trace() přidává příponu .xt vždy automaticky
$xdebugTrace = new \Panel\XDebugTrace(TMP_DIR . '/xdebug_trace_file');
// Přidání panelu
\Nette\Diagnostics\Debugger::addPanel($xdebugTrace);
// Panel je zaregistrován, ale trasování zatím neběží
Spuštění trasování
$xdebugTrace->start();
...
... kód který chceme sledovat
...
$xdebugTrace->pause();
// Pokračování trace logu
$xdebugTrace->start();
...
... kód který chceme sledovat
...
$xdebugTrace->stop();
// Případně lze odkudkoliv použít statickou variantu
\Panel\XDebugTrace::callStart();
\Panel\XDebugTrace::callPause();
\Panel\XDebugTrace::callStop();
Filtrování záznamů trace logu
Pro plné využití panelu je klíčové filtrování. Ne všechny záznamy
z trace logu chceme vidět. Log může dosahovat velikosti v megabajtech. Pro
odfiltrování nežádoucích záznamů lze přidat vlastní callbacky pomocí
\Panel\XDebugTrace::addFilterCallback(), viz. zdrojový kód.
Výchozí filtr je \Panel\XDebugTrace::defaultFilterCb().
Před psaním filtru je potřeba znát strukturu XDebug trace logu. Ta je zhruba následující.
[Entry záznam - vstup do funkce] level id 0 time memory functionName ... [Exit záznam - výstup z funkce] level id 1 time memory [Tedy například] 3 121 0 0.012 401442 mojeFunkce - entry do mojeFunkce() 4 122 0 0.014 401442 strpos - entry do strpos() 4 122 1 0.015 401454 - exit ze strpos() 4 123 0 0.016 401454 substr - entry do substr() 4 123 1 0.018 401505 - exit ze substr() 3 121 1 0.020 401442 - exit z mojeFunkce()
Do filtrovacích callbacků se předávají záznamy již naparsované jako objekt stdClass.
stdClass Object
(
[level] => 3
[id] => 830
[exited] => false
[time] => 0.035398
[exitTime] => NULL
[deltaTime] => NULL
[memory] => 3749168
[exitMemory] => NULL
[deltaMemory] => NULL
[function] => mySleep
[isInternal] => false
[includeFile] => NULL
[filename] => D:\Web\nette-sandobx-2.0-Beta\app\bootstrap.php
[line] => 68
[evalInfo] => ''
)
s tím, že property exitTime, deltaTime,
exitMemory a deltaMemory jsou vyplněny pouze při
volání FILTER_EXIT callbacku (viz. dále).
Při přidávání callbacku filtru je výchozí chování takové, že filtr bude volán pouze na vstupní záznamy (entry) a bude volán PŘED ostatními již přidanými filtry. Toto chování lze změni druhým parametrem (bitmaskou).
- XDebugTrace::FILTER_APPEND – callback se zařadí ZA ostatní filtry
- XDebugTrace::FILTER_ENTRY – bude volán na vstupní záznamy (entry)
- XDebugTrace::FILTER_EXIT – bude volán na výstupní (exit)
- XDebugTrace::FILTER_BOTH – stejné jako FILTER_ENTRY | FILTER_EXIT
- XDebugTrace::FILTER_REPLACE – nejprve smaže všechny filtry a pak se přidá
Příklady filtrů
// Zobrazit pouze funkci count(), ostatní filtry vymažeme
$xdebugTrace->addFilterCallback(function($record) {
if ($record->function !== 'count') {
return \Panel\XDebugTrace::SKIP;
}
}, \Panel\XDebugTrace::FILTER_REPLACE);
Namísto addFilterCallback($callback,
\Panel\XDebugTrace::FILTER_REPLACE) můžeme používat funkci
setFilterCallback($callback).
// Chceme detailně prohlédnout každé volání funkce Nette\Utils\LimitedScope::load()
// Všiměte si druhého parametry $onEntry. Ten je TRUE pro entry, FALSE pro exit volání.
$xdebugTrace->setFilterCallback(function($record, $onEntry){
static $cnt = 0;
if ($record->function === 'Nette\Utils\LimitedScope::load') {
$cnt += $onEntry ? 1 : -1;
return NULL;
}
return $cnt ? NULL : \Panel\XDebugTrace::SKIP;
}, \Panel\XDebugTrace::FILTER_BOTH);
// Zobrazíme vše mimo interních funkcí
$xdebugTrace->setFilterCallback(function($record){
return $record->isInternal ? \Panel\XDebugTrace::SKIP : NULL;
});
// Zobrazíme pouze funkce, které běží déle než 1 ms.
// Musí se registrovat pro FILTER_EXIT, jinak není deltaTime k dispozici.
$xdebugTrace->setFilterCallback(function($record) {
if ($record->deltaTime < 0.001) {
return \Panel\XDebugTrace::SKIP;
}
}, \Panel\XDebugTrace::FILTER_EXIT);
