Návod: Jak ladit

From mediawiki.org
Jump to navigation Jump to search
This page is a translated version of the page Manual:How to debug and the translation is 94% complete.
Outdated translations are marked like this.
Other languages:
Bahasa Indonesia • ‎Deutsch • ‎English • ‎Nederlands • ‎dansk • ‎español • ‎français • ‎polski • ‎português do Brasil • ‎svenska • ‎čeština • ‎русский • ‎ไทย • ‎中文 • ‎日本語 • ‎한국어

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 (přímo pod <?php) $localsettings:

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

Nebo jej zadejte do php.ini :

error_reporting = E_ALL
display_errors = On

Nebo jej zadejte do .htaccess:

php_value error_reporting -1
php_flag display_errors On

Chyby PHP 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 false. Povolte je nastavením jejich true v LocalSettings.php :

  • $wgShowExceptionDetails Na stránce „Závažná chyba“ (Fatal error) můžete zobrazit více podrobností (například trasování zásobníku).
  • $wgDebugToolbar Zobrazuje na stránce panel nástrojů s profilováním, protokolovacími zprávami a dalšími.
  • $wgShowDebug Přidá část "protokolové zprávy" (log messages) wgDebugToolbar jako nezpracovaný seznam na stránku.
  • $wgDevelopmentWarnings MediaWiki vyvolá upozornění na možné chyby 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 nazačá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;
MediaWiki versions:
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) viz Manual:How to debug/with MediaWiki-Vagrant and PHPStorm .

Zend

Pokud používáte interpret Zend PHP, můžete svůj kód ladit pomocí XDebug. MediaWiki-Vagrant má za tímto účelem vestavěné built in settings (nastavení ladicího souboru). Pokud nepoužíváte MediaWiki-Vagrant, ale vaše nastavení je podobné, můžete tyto hodnoty znovu 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 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 documentation.

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 fungovat pro MediaWiki-Vagrant) podle potřeby.

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 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 #Creating a custom log file.

Ladění životnost 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 cookie 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

MediaWiki version:
1.31

Chcete-li vytvořit vlastní soubor protokolu, který obsahuje pouze vaše specifické příkazy ladění, použijte funkci wfError(Log) (použití wfErrorLog bylo v MediaWiki 1.25 zastaralé). Tato funkce používá dva argumenty, textový řetězec k protokolování a cestu k souboru protokolu:

This function takes two arguments, the text string to log and the path to the log file:

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. Pro další informace viz $wgDebugLogGroups .

Chcete-li nastavit vlastní skupiny protokolů, použijte 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';
$wgRateLimitLog = '/var/log/mediawiki/ratelimit.log';
$wgDebugLogGroups = array(
	'resourceloader' => '/var/log/mediawiki/resourceloader.log',
	'exception' => '/var/log/mediawiki/exception.log',
	'error' => '/var/log/mediawiki/error.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ů žurnálu do adresáře /tmp nemusí vygenerovat žádný soubor žurnálu, i když by adresář tmp měl být kdykoli zapisovatelný. 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ář. Když 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í

MediaWiki version:
1.25

Strukturované protokolování umožňuje zahrnout do záznamu protokolu pole Pro další informace viz 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 za Extension: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 poslat 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 grafitového 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().

Odeslat debug data 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ýrobě 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č $vagrant integruje interaktivní prostředí PHP hhvmsh (při použití výchozí HHVM) nebo 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)

Wikipedia 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í ResourceLoader, 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 konzole 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.
  • You can add ?debug=true to your URL as in https://www.mediawiki.org/wiki/MediaWiki?debug=true to get more detailed information for debugging via your browser's console

Viz též