Jump to content

手册:如何调试

From mediawiki.org
This page is a translated version of the page Manual:How to debug and the translation is 76% complete.
Outdated translations are marked like this.

该页面对调试MediaWiki软件进行了基本介绍。

您会注意到的第一件事是,“echo”通常不起作用。这是常规设计的一部分。

有几个配置选项可以帮助调试。以下选项默认都是false。 通过在LocalSettings.php 中将它们设置为true来启用它们:

  • $wgShowExceptionDetails 启用更多细节(例如“栈追踪”)以在“致命的错误”页面上显示。
  • $wgDebugToolbar 在页面上显示带有"分析"、“日志消息”等的工具栏
  • $wgShowDebug 将 wgDebugToolbar 的“日志消息”部分作为原始列表添加到页面。
  • $wgDevelopmentWarnings MediaWiki 将针对一些可能的错误情况和已弃用的功能发出通知。

要添加到您的LocalSettings.php 中的示例行:

$wgShowExceptionDetails = true;

PHP错误

要查看PHP错误,请在LocalSettings.php 中从前面开始的第二行(就在<?php下面)添加这段代码:

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

或在php.ini 设置:

error_reporting = E_ALL
display_errors = On

或在.htaccess中设置:

php_value error_reporting -1
php_flag display_errors On

这将使PHP错误显示在页面上。这可能会使攻击者更容易找到进入你的服务器的方法,因此在找到问题后请禁用它。

请注意,在执行上述行之前有可能发生“致命”PHP 错误,或者可能会阻止信息显示。 致命的PHP错误通常记录到Apache的错误日志中——检查php.ini中的error_log设置(或使用phpinfo())。

开启 display_startup_errors

一些提供程序会关闭 display_startup_errors,即使您提高error_reporting级别也会隐藏错误。 在程序中打开它为时已晚!相反,您必须围绕您的文件创建一个包装文件。 对于 MediaWiki,您只需将其添加到mediawiki/index.php之上:

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

在其它环境中:

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

SQL错误

要记录所有SQL查询,而不仅仅是引发异常的查询,请在LocalSettings.php中设置$wgDebugDumpSql

$wgDebugDumpSql = true;
MediaWiki版本:
1.16 – 1.31

对于 MediaWiki 1.32 之前的版本,您需要设置 $wgShowSQLErrors$wgShowDBErrorBacktrace 以在 HTML 输出中查看数据库异常的详细信息:

$wgShowSQLErrors = true;
$wgShowDBErrorBacktrace = true;

深度调试

调试器

您可以用XDebug 逐步调试代码。对于一些常见的配置,请参阅:

MediaWiki-Vagrant有对此的内置设置。 如果您不是使用MediaWiki-Vagrant,但配置类似,则可以复用这些值。 在某些情况下(如由于防火墙),您可能必须在与Web服务器相同的机器上使用IDE。 在这种情况下,只需设置:

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

有关详细信息,请参阅 XDebug 文档

要在 MediaWiki-Vagrant 上调试命令行脚本(例如 PHPUnit 或维护脚本),请使用:

xdebug_on; php /vagrant/mediawiki/path/to/script.php --wiki=wiki ; xdebug_off

根据需要调整脚本、参数和远程主机(它应该是您的IP所在计算机的IP,10.0.2.2应该适用于MediaWiki-Vagrant)。

记录

有关更多详细信息,您需要分析和记录错误。

以下说明仅对默认配置有效。 如果更改$wgMWLoggerDefaultSpi ,例如在vagrant 环境里启用psr3角色,则这些设置可能会被忽略。 在这种情况下,请参阅记录器的文档,例如Manual:MonologSpi

设置调试日志文件

要将错误和调试信息保存到日志中,请将$wgDebugLogFile 添加到LocalSettings.php文件中。将值更改为要保存调试跟踪输出的文本文件。

MediaWiki 软件必须从您的操作系统获得创建和写入该文件的权限,例如在默认的Ubuntu安装中,它以用户和组www-data:www-data的身份运行代码。 这是一个设置示例:

/**
 * 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";

该文件将包含来自 MediaWiki 核心和扩展的大量调试信息。 一些子系统写入自定义日志,请参阅 #创建自定义日志文件 以捕获它们的输出。


警告 警告: 调试日志文件可以包含私人信息,例如登录凭据、会话 cookie 和提交表单的值。 如果此信息可公开访问,则攻击者可以使用它来入侵和破坏您的计算机和用户帐户。 如果您出于诊断目的需要共享调试日志,请在未登录的情况下访问 wiki,并从调试日志中删除任何 COOKIE 行,并且不要包含任何登录尝试的捕获。

创建自定义日志文件

MediaWiki版本:
1.31

在 MediaWiki 1.32 之前,要创建仅包含特定调试语句的自定义日志文件,请使用 wfErrorLog() 函数。 这个函数有两个参数,要记录的文本字符串和日志文件的路径:

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

创建自定义日志组

如果您正在调试几个不同的组件,将某些日志组写入单独的文件可能会很有用。 参见$wgDebugLogGroups 以获取更多信息。

要设置自定义日志组,请在 LocalSettings.php 中使用以下内容:

/**
 * 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(
	'exception' => '/var/log/mediawiki/exception.log',
	'resourceloader' => '/var/log/mediawiki/resourceloader.log',
	'ratelimit' => '/var/log/mediawiki/ratelimit.log',

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

要记录到这些组之一,请像这样调用wfDebugLog

if ( $module->hasFailed ) {
    wfDebugLog( 'myextension', "Something is not right, module {$module->name} failed." );
}
如果您已仔细遵循上述说明,但没有任何内容写入日志文件,并且您的系统正在使用 SELinux,请查看 SELinux 页面上的日志部分 以解决此SELinux 上下文相关的问题。
将日志文件写入 /tmp 目录可能根本不会生成任何日志文件,即使 /tmp 目录应该可以被任何人写入。 这种情况可能发生在如果您的系统正在使用为该进程创建虚拟 /tmp 目录的 systemd 功能之一时。 如果是这种情况,请将您的日志文件配置为写入不同的目录,例如 /var/log/mediawiki

结构化日志

MediaWiki版本:
1.25

结构化日志允许您在日志记录中包括字段。 参见Structured logging 以获取更多信息。

您将需要配置一个更好的记录器,例如 Monolog,来收集额外的字段。

JavaScript错误记录

MediaWiki版本:
1.36

参见mediawiki.errorLogger ResourceLoader模块文档。

统计

可以使用 Extension:EventLogging 执行高级客户端日志记录,这需要复杂的设置和仔细检查隐私问题。

使用StatsD可以对某些类型的事件进行简单计数(自MediaWiki 1.25起)。StatsD提供仪表、计量器、计数器和计时指标。

用例:

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

这些指标可发送到StatsD服务器,可通过wgStatsdServer配置变量指定。 (若未设置,指标将被丢弃。) 您可以通过启动StatsD服务器并使用“backends/console”后端进行配置来在本地使用StatsD(无需Graphite服务器),这会将指标输出到控制台。

从MediaWiki 1.25开始,wfIncrStats()是主RequestContext::getStats()实例上increment()方法的快捷方式。

将调试数据发送到输出中的HTML注释

This may occasionally be useful when supporting a non-technical end-user. It's more secure than exposing the debug log file to the web, since the output only contains private data for the current user. But it's not ideal for development use since data is lost on fatal errors and redirects. Use on production sites is not recommended. Debug comments reveal information in page views which could potentially expose security risks.

$wgDebugComments = true;

Working live with MediaWiki objects

eval.php is an interactive script to evaluate and interact with MediaWiki objects and functions in a fully initialized environment.

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

The MediaWiki-Vagrant portable virtual machine integrates the interactive PHP shell phpsh (when using Zend).

Callable updates

Code embedded in the DeferredUpdates::addCallableUpdate() function, such as $rc->save() in RecentChange.php, is not executed during the web request, so no error message will be displayed if it fails. For debugging, it may be helpful to temporarily remove the code from within the function so that it is executed live.

Interactive shell

You can use shell.php as a PHP REPL with full access to MediaWiki internals.

Client side debugging (JavaScript)

Wikipedia offers a rich set of tools for debugging client side JavaScript. In addition to the MediaWiki tools, other techniques are available to assist with diagnosing client interactions.

工具:

  • Open your browser's console.

Many client side mediawiki scripts log error messages to the console using ResourceLoader, which provides a safety oriented way to log to the client console. Beyond the native JavaScript logging function, it provides a check to ensure that a console is available and that logging does not produce its own error. ResourceLoader/Architecture#Debug_mode also describes this feature.

  • Browser tools may provide native functionality to debug client side script.
  • Network tracers, like Wireshark can provide insight into the script that is being provided by a page.

参见

  • Useful debugging tip: throw new MWException( 'foo' ); (dies with the given message and prints the callstack)