added amb1169 - dumping handles to game logs

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401693
This commit is contained in:
David Anderson 2007-11-17 01:43:25 +00:00
parent d2b288fd6a
commit ecbd1f5e36
3 changed files with 54 additions and 15 deletions

View File

@ -290,6 +290,34 @@ CON_COMMAND(sm, "SourceMod Menu")
g_RootMenu.GotRootCmd(args); g_RootMenu.GotRootCmd(args);
} }
FILE *g_pHndlLog = NULL;
void write_handles_to_log(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(g_pHndlLog, fmt, ap);
fprintf(g_pHndlLog, "\n");
va_end(ap);
}
void write_handles_to_game(const char *fmt, ...)
{
size_t len;
va_list ap;
char buffer[1024];
va_start(ap, fmt);
len = UTIL_FormatArgs(buffer, sizeof(buffer)-2, fmt, ap);
va_end(ap);
buffer[len] = '\n';
buffer[len+1] = '\0';
engine->LogPrint(buffer);
}
CON_COMMAND(sm_dump_handles, "Dumps Handle usage to a file for finding Handle leaks") CON_COMMAND(sm_dump_handles, "Dumps Handle usage to a file for finding Handle leaks")
{ {
#if !defined ORANGEBOX_BUILD #if !defined ORANGEBOX_BUILD
@ -297,19 +325,28 @@ CON_COMMAND(sm_dump_handles, "Dumps Handle usage to a file for finding Handle le
#endif #endif
if (args.ArgC() < 2) if (args.ArgC() < 2)
{ {
g_RootMenu.ConsolePrint("Usage: sm_dump_handles <file>"); g_RootMenu.ConsolePrint("Usage: sm_dump_handles <file> or <log> for game logs");
return; return;
} }
const char *arg = args.Arg(1); if (strcmp(args.Arg(1), "log") != 0)
FILE *fp = fopen(arg, "wt");
if (!fp)
{ {
g_RootMenu.ConsolePrint("Could not find file \"%s\"", arg); const char *arg = args.Arg(1);
return; FILE *fp = fopen(arg, "wt");
if (!fp)
{
g_RootMenu.ConsolePrint("Could not find file \"%s\"", arg);
return;
}
g_pHndlLog = fp;
g_HandleSys.Dump(write_handles_to_log);
g_pHndlLog = NULL;
fclose(fp);
}
else
{
g_HandleSys.Dump(write_handles_to_game);
} }
g_HandleSys.Dump(fp);
fclose(fp);
} }

View File

@ -994,10 +994,10 @@ bool HandleSystem::TryAndFreeSomeHandles()
return g_PluginSys.UnloadPlugin(highest_owner); return g_PluginSys.UnloadPlugin(highest_owner);
} }
void HandleSystem::Dump(FILE *fp) void HandleSystem::Dump(HANDLE_REPORTER rep)
{ {
fprintf(fp, "%-10.10s\t%-20.20s\t%-20.20s\n", "Handle", "Owner", "Type"); rep("%-10.10s\t%-20.20s\t%-20.20s", "Handle", "Owner", "Type");
fprintf(fp, "---------------------------------------------\n"); rep("---------------------------------------------");
for (unsigned int i = 1; i <= m_HandleTail; i++) for (unsigned int i = 1; i <= m_HandleTail; i++)
{ {
if (m_Handles[i].set != HandleSet_Used) if (m_Handles[i].set != HandleSet_Used)
@ -1046,7 +1046,7 @@ void HandleSystem::Dump(FILE *fp)
{ {
type = m_strtab->GetString(pType->nameIdx); type = m_strtab->GetString(pType->nameIdx);
} }
fprintf(fp, "0x%08x\t%-20.20s\t%-20.20s\n", index, owner, type); rep("0x%08x\t%-20.20s\t%-20.20s", index, owner, type);
} }
} }

View File

@ -105,6 +105,8 @@ struct QHandleType
int nameIdx; int nameIdx;
}; };
typedef void (HANDLE_REPORTER)(const char *str, ...);
class HandleSystem : class HandleSystem :
public IHandleSys public IHandleSys
{ {
@ -155,7 +157,7 @@ public: //IHandleSystem
const HandleAccess *pAccess, const HandleAccess *pAccess,
HandleError *err); HandleError *err);
void Dump(FILE *fp); void Dump(HANDLE_REPORTER rep);
protected: protected:
/** /**
* Decodes a handle with sanity and security checking. * Decodes a handle with sanity and security checking.