Návod:Jak ladit

From mediawiki.org
This page is a translated version of the page Manual:How to debug and the translation is 100% complete.

Tato stránka poskytuje základní úvod k softwaru odstraňování chyb MediaWiki.

Jednou z prvních věcí, které si všimnete, je, že "echo" obecně nefunguje. Což je součást obecného designu.

Chyby PHP

Chcete-li zobrazit chyby PHP, přidejte toto do druhého řádku se shora (vpravo pod <?php) do LocalSettings.php :

error_reporting( -1 );
ini_set( 'display_errors', 1 );

Nebo zadejte do php.ini :

error_reporting = E_ALL
display_errors = On

Nebo zadejte do .htaccess:

php_value error_reporting -1
php_flag display_errors On

Chyby PHP e budou zobrazovat na stránce. Tato úprava může útočníkům usnadnit nalezení cesty na váš server. Proto pokud problém najdete, znovu vypněte "echo".

Nezapomeňte, že k fatálním chybám PHP může dojít dříve, než budou výše uvedené řádky provedeny, neboť mohou zabránit jejich zobrazení. Závažné chyby PHP se obvykle zaznamenávají do protokolu chyb Apache - zkontrolujte nastavení error_log v php.ini (nebo použijte phpinfo()).

K ladění existuje několik možností konfigurace. Ve výchozím nastavení jsou všechny nastaveny na false. Povolte je v LocalSettings.php nastavením na true:

  • $wgShowExceptionDetails Povolení zobrazení dalších podrobností (jako je trasování zásobníku) na stránce "Závažná chyba" (fatal error).
  • $wgDebugToolbar Zobrazení na stránce panel nástrojů s profilováním, protokolovacími zprávami a dalšími.
  • $wgShowDebug Přidá na stránku část "zprávy protokolu" wgDebugToolbar jako nezpracovaný seznam.
  • $wgDevelopmentWarnings Vyvolá upozornění na možné chyby MediaWiki a na zastaralé funkce.

Zapnutí display_startup_errors

Někteří poskytovatelé vypnou display_startup_errors, což chyby skryje, i když zvýšíte úroveň error_reporting. Zapnutí při běhu programu je příliš pozdě! Místo toho budete muset vytvořit soubor obálek kolem vašeho souboru. V případě MediaWiki stačí přidat toto na začátek mediawiki/index.php:

--- index.php
    error_reporting( -1 );
    ini_set( 'display_startup_errors', 1 );
    ini_set( 'display_errors', 1 );

V jiných prostředích:

--- myTestFile.php
    error_reporting( -1 );
    ini_set( 'display_startup_errors', 1 );
    ini_set( 'display_errors', 1 );
    require 'your_file.php';

SQL chyby

Chcete-li protokolovat všechny dotazy SQL, nikoli pouze ten, který vyvolal výjimku, nastavte $wgDebugDumpSql v LocalSettings.php:

$wgDebugDumpSql = true;
Verze MediaWiki:
1.16 – 1.31

Před verzí MediaWiki 1.32 musíte nastavit $wgShowSQLErrors a $wgShowDBErrorBacktrace, abyste viděli podrobnosti o výjimkách databáze ve výstupu HTML:

$wgShowSQLErrors = true;
$wgShowDBErrorBacktrace = true;

Hloubkové ladění

Debugger

Nejběžnější nastavení (pomocí MediaWiki-Vagrant a PhpStorm) najdete na stránce Manual:How to debug/with MediaWiki-Vagrant and PHPStorm .

Zend

Pokud používáte překladač Zend PHP, můžete svůj kód ladit pomocí XDebug. MediaWiki-Vagrant má za tímto účelem vestavěné nastavení ladicího souboru. Pokud nepoužíváte MediaWiki-Vagrant, ale vaše nastavení je podobné, můžete tyto hodnoty taktéž použít. V některých případech (např. kvůli bráně firewall) může být nutné použít IDE na stejném počítači jako je webový server. V tomto případě můžete jednoduše nastavit:

xdebug.remote_enable = 1
xdebug.remote_host = 'localhost'

Další informace naleznete v dokumentaci XDebug.

K ladění skriptu příkazového řádku (např. PHPUnit nebo skriptu údržby) na MediaWiki-Vagrant použijte:

xdebug_on; php5 /vagrant/mediawiki/tests/phpunit/phpunit.php --wiki=wiki /vagrant/mediawiki/extensions/Extension/tests/phpunit/SomeTest.php; xdebug_off

Upravte skript, parametry a vzdáleného hostitele (měla by to být IP počítače, kde je vaše IP, 10.0.2.2 by měla podle potřeby fungovat pro MediaWiki-Vagrant).

Protokolování

Pro mnohem podrobnější informace je třeba se profilovat a zaznamenávat chyby.

Pokyny níže platí pouze pro výchozí konfiguraci. Pokud změníte $wgMWLoggerDefaultSpi , například povolíte roli psr3 v vagrant boxu, budou tato nastavení pravděpodobně ignorována. Podívejte se v tomto případě do dokumentace k vašemu loggeru, například na stránku Manual:MonologSpi .

Nastavení souboru protokolu ladění

Chcete-li uložit chyby a informace o ladění do protokolu, přidejte soubor $wgDebugLogFile do souboru LocalSettings.php. Změňte hodnotu na textový soubor, do kterého chcete uložit výstup trasování ladění.

Software MediaWiki musí mít oprávnění od vašeho operačního systému k vytvoření a zápisu do tohoto souboru, například ve výchozí instalaci Ubuntu běží jako uživatel a skupina www-data: www-data. Zde je ukázkové nastavení:

/**
 * The debug log file must never be publicly accessible because it
 * contains private data. But ensure that the directory is writeable by the
 * PHP script running within your Web server.
 * The filename is with the database name of the wiki.
 */
$wgDebugLogFile = "/var/log/mediawiki/debug-{$wgDBname}.log";

Tento soubor bude obsahovat mnoho ladících informací z jádra a rozšíření MediaWiki. Některé subsystémy zapisují do vlastních protokolů. Informace o zachycení jejich výstupu naleznete v části #Vytvoření vlastního souboru protokolu.

Ladění životnosti databázových transakcí lze povolit pro některé databáze pomocí $wgDebugDBTransactions .

Varování Varování: Soubor protokolu ladění může obsahovat soukromé informace, jako jsou přihlašovací údaje, soubory cookies relací a hodnoty odeslaných formulářů. Pokud jsou tyto informace veřejně přístupné, mohou je útočníci použít k hackování a ohrožení vašeho počítače a uživatelského účtu. Pokud potřebujete sdílet diagnostické protokoly ladění, otevřete wiki bez přihlášení a odeberte z protokolu ladění všechny řádky COOKIE a nezachyťte žádný pokus o přihlášení.

Vytvoření vlastního souboru protokolu

Verze MediaWiki:
1.31

U starších verzí před MediaWiki 1.32 použijte funkci wfErrorLog() k vytvoření vlastního souboru protokolu, který obsahuje pouze vaše konkrétní ladicí příkazy. Tato funkce používá dva argumenty, textový řetězec k protokolování a cestu k souboru protokolu:

wfErrorLog( "An error occurred.\n", '/var/log/mediawiki/my-custom-debug.log' );

Vytváření vlastních skupin protokolů

Pokud ladíte několik různých součástí najednou, může být užitečné nasměrovat určité skupiny protokolů k zápisu do samostatného souboru. Další informace naleznete na stránce $wgDebugLogGroups .

Chcete-li nastavit vlastní skupiny protokolů, použijte v LocalSettings.php následující:

/**
 * The debug log file should not be publicly accessible if it is used, as it
 * may contain private data. However, it must be in a directory to which PHP run
 * within your web server can write.
 *
 * Contrary to wgDebugLogFile, it is not necessary to include a wiki-id in these log file names
 * if you have multiple wikis. These log entries are prefixed with sufficient information to
 * identify the relevant wiki (web server hostname and wiki-id).
 */

// Groups from MediaWiki core
$wgDBerrorLog = '/var/log/mediawiki/dberror.log';
$wgDebugLogGroups = array(
	'resourceloader' => '/var/log/mediawiki/resourceloader.log',
	'exception' => '/var/log/mediawiki/exception.log',
	'error' => '/var/log/mediawiki/error.log',
	'ratelimit' => '/var/log/mediawiki/ratelimit.log',
	#'exception-json' => '/var/log/mediawiki/exception.json',

	// Extra log groups from your extension
	#'myextension' => '/var/log/mediawiki/myextension.log',
	#'somegroup' => '/var/log/mediawiki/somegroup.log',
);

Chcete-li se přihlásit k jedné z těchto skupin, volejte wfDebugLog takto:

if ( $module->hasFailed ) {
    wfDebugLog( 'myextension', "Something is not right, module {$module->name} failed." );
}
Pokud jste pečlivě dodržovali výše uvedené pokyny, ale do vašich protokolovacích souborů se nic nezapíše, a pokud váš systém používá SELinux, podívejte se do části protokolování na stránce SELinux a obraťte se na tento problém SELinux v kontextovém dotazu.
Zápis souborů protokolu do adresáře /tmp nemusí vygenerovat vůbec žádný soubor protokolu, i když se předpokládá, že do adresáře /tmp může zapisovat kdokoli. K tomu by mohlo dojít, pokud váš systém používá jednu z funkcí systemd, které pro tento proces vytvářejí virtuální /tmp adresář. Pokud tomu tak je, nakonfigurujte svůj soubor protokolu tak, aby byl zapsán do jiného adresáře, například /var/log/mediawiki.

Strukturované protokolování

Verze MediaWiki:
1.25

Strukturované protokolování umožňuje zahrnout do záznamu protokolu pole. Další informace získáte na stránce Structured logging .

Budete muset nakonfigurovat lepší záznamník, aby shromažďoval další pole. Například Monolog.

Statistiky

Pokročilé protokolování na straně klienta lze provádět při použití Rozšíření:EventLogging . Což vyžaduje komplexní nastavení a pečlivou kontrolu problémů s ochranou osobních údajů.

Jednoduché počítání určitých druhů událostí je možné (od MediaWiki 1.25) pomocí StatsD. StatsD nabízí měřiče, měřidla, čítače a metriky časování.

Příklad použití:

$stats = $context->getStats();
$stats->increment( 'resourceloader.cache.hits' );
$stats->timing( 'resourceloader.cache.rtt', $rtt );

Metriky lze odeslat na server StatsD, který lze určit pomocí konfigurační proměnné wgStatsdServer. (Pokud není nastaveno, metriky se zahodí.) Se StatsD můžete pracovat lokálně (bez potřeby Grafite serveru), spuštěním serveru StatsD a jeho konfigurací s "backends/console" backendem, který vyvede metriky do konzoly.

Od MediaWiki 1.25 je wfIncrStats() zkratkou metody increment() v hlavní instanci RequestContext::getStats().

Odeslání debug dat do komentáře HTML ve výstupu

To může být někdy užitečné při podpoře netechnického koncového uživatele. Je to bezpečnější než vystavení souboru protokolu ladění webu. Protože výstup obsahuje pouze soukromá data pro aktuálního uživatele. Není to však ideální pro vývojové použití, protože se ztratí data o závažných chybách a přesměrováních. Použití ve vývoji se nedoporučuje. Ladící komentáře odhalují informace v zobrazeních stránek, které by mohla potenciálně vystavit bezpečnostním rizikům.

$wgDebugComments = true;

Práce živě s objekty MediaWiki

eval.php je interaktivní skript pro vyhodnocení a interakci s objekty a funkcemi MediaWiki v plně inicializovaném prostředí.

 $ php maintenance/eval.php
 > print wfMessage("Recentchanges")->plain();
 Recent changes

Virtuální počítač MediaWiki-Vagrant integruje interaktivní prostředí PHP phpsh (při použití Zendu).

Volitelné aktualizace

Kód vložený do funkce DeferredUpdates::addCallableUpdate(), jako je například $rc->save() v RecentChange.php, není proveden během webového požadavku. Takže pokud se nezdaří, nebude zobrazena žádná chybová zpráva. Pro ladění může být užitečné dočasně odebrat kód z funkce, aby byl spuštěn živě.

Ladění na straně klienta (JavaScript)

Wikipedie nabízí bohatou sadu nástrojů pro ladění JavaScriptu na straně klienta. Kromě nástrojů MediaWiki jsou k dispozici další techniky, které pomáhají diagnostikovat interakce klienta.

Nástroje:

  • ResourceLoader nabízí prostředek k zajištění JavaScriptu, který lze snadno zobrazit pomocí nástrojů na straně klienta.
  • Otevřete konzolu prohlížeče. Mnoho skriptů Mediawiki na straně klienta zaznamenává chybové zprávy do konzole pomocí ResourceLoaderu, který poskytuje bezpečně orientovaný způsob pro přihlášení do klientské konzole. Kromě funkce protokolování nativního JavaScriptu poskytuje kontrolu, zda je k dispozici konzola a že protokolování nevyvolává svou vlastní chybu. Režim ladění architektury zavaděče zdrojů také popisuje tuto funkci.
  • Nástroje prohlížeče mohou poskytovat nativní funkce pro ladění skriptu na straně klienta.
  • Síťové indikátory, například Wireshark, mohou poskytnout nahlédnutí do skriptu, který poskytuje stránka.
  • Ke své adrese URL můžete přidat ?debug=true jako v https://www.mediawiki.org/wiki/MediaWiki?debug=true, abyste získali podrobnější informace pro ladění prostřednictvím konzole prohlížeče

Související odkazy