core/CDbgReporter.cpp
author David Anderson <dvander@alliedmods.net>
Sat Feb 17 19:03:18 2007 +0000 (2007-02-17)
changeset 520 7676d61cde2d
parent 469 e9a53be35abd
permissions -rw-r--r--
added helper a core translation helper to the translator
regadmincmd is now officially done and tested, as are overrides
printtoplayers now prints to the server on id==0 as a convenience
fixed a crash bug in the admin system
fixed up console.inc a bit
dvander@370
     1
/**
dvander@370
     2
 * ===============================================================
dvander@370
     3
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@370
     4
 * ===============================================================
dvander@370
     5
 *
dvander@370
     6
 * This file is not open source and may not be copied without explicit
dvander@370
     7
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@370
     8
 * in whole or significant part.
dvander@370
     9
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@370
    10
 *
dvander@370
    11
 * Version: $Id$
dvander@370
    12
 */
dvander@370
    13
faluco@288
    14
#include "CDbgReporter.h"
faluco@288
    15
#include "CLogger.h"
faluco@288
    16
#include "PluginSys.h"
faluco@288
    17
ds@462
    18
CDbgReporter g_DbgReporter;
ds@462
    19
faluco@288
    20
void CDbgReporter::OnSourceModAllInitialized()
faluco@288
    21
{
faluco@288
    22
	g_pSourcePawn->SetDebugListener(this);
faluco@288
    23
}
faluco@288
    24
faluco@288
    25
void CDbgReporter::OnContextExecuteError(IPluginContext *ctx, IContextTrace *error)
faluco@288
    26
{
faluco@288
    27
	const char *lastname;
faluco@288
    28
	const char *plname = g_PluginSys.FindPluginByContext(ctx->GetContext())->GetFilename();
faluco@288
    29
	int n_err = error->GetErrorCode();
faluco@288
    30
faluco@288
    31
	if (n_err != SP_ERROR_NATIVE)
faluco@288
    32
	{
dvander@307
    33
		g_Logger.LogError("[SM] Plugin \"%s\" encountered error %d: %s",
faluco@288
    34
			plname,
faluco@288
    35
			n_err,
faluco@288
    36
			error->GetErrorString());
faluco@288
    37
	}
faluco@288
    38
faluco@288
    39
	if ((lastname=error->GetLastNative(NULL)) != NULL)
faluco@288
    40
	{
faluco@288
    41
		const char *custerr;
faluco@288
    42
		if ((custerr=error->GetCustomErrorString()) != NULL)
faluco@288
    43
		{
ds@469
    44
			g_Logger.LogError("[SM] Native \"%s\" reported: %s", lastname, custerr);
faluco@288
    45
		} else {
dvander@307
    46
			g_Logger.LogError("[SM] Native \"%s\" encountered a generic error.", lastname);
faluco@288
    47
		}
faluco@288
    48
	}
faluco@288
    49
faluco@288
    50
	if (!error->DebugInfoAvailable())
faluco@288
    51
	{
dvander@307
    52
		g_Logger.LogError("[SM] Debug mode is not enabled for this plugin.");
dvander@307
    53
		g_Logger.LogError("[SM] To enable debug mode, edit plugin_settings.cfg, or type: sm plugins debug %d on",
faluco@288
    54
			_GetPluginIndex(ctx));
faluco@288
    55
		return;
faluco@288
    56
	}
faluco@288
    57
faluco@288
    58
	CallStackInfo stk_info;
faluco@288
    59
	int i = 0;
dvander@307
    60
	g_Logger.LogError("[SM] Displaying call stack trace:");
faluco@288
    61
	while (error->GetTraceInfo(&stk_info))
faluco@288
    62
	{
dvander@307
    63
		g_Logger.LogError("[SM]   [%d]  Line %d, %s::%s()",
faluco@288
    64
			i++,
faluco@288
    65
			stk_info.line,
faluco@288
    66
			stk_info.filename,
faluco@288
    67
			stk_info.function);
faluco@288
    68
	}
faluco@288
    69
}
faluco@288
    70
faluco@288
    71
int CDbgReporter::_GetPluginIndex(IPluginContext *ctx)
faluco@288
    72
{
faluco@288
    73
	int id = 1;
faluco@288
    74
	IPluginIterator *iter = g_PluginSys.GetPluginIterator();
faluco@288
    75
faluco@288
    76
	for (; iter->MorePlugins(); iter->NextPlugin(), id++)
faluco@288
    77
	{
faluco@288
    78
		IPlugin *pl = iter->GetPlugin();
faluco@288
    79
		if (pl->GetBaseContext() == ctx)
faluco@288
    80
		{
faluco@288
    81
			iter->Release();
faluco@288
    82
			return id;
faluco@288
    83
		}
faluco@288
    84
	}
faluco@288
    85
faluco@288
    86
	iter->Release();
faluco@288
    87
	return -1;
dvander@351
    88
}
dvander@351
    89