forked from metin-server/m2dev-client-src
Several bug fixes
This commit is contained in:
@@ -80,6 +80,57 @@ static TCachedTimestamp g_cachedTimestamp;
|
||||
#define DBG_OUT_W_UTF8(psz) do { (void)(psz); } while (0)
|
||||
#endif
|
||||
|
||||
// MR-11: Colored console output for syserr and packet dumps
|
||||
#ifdef _DEBUG
|
||||
static WORD g_consoleDefaultAttrs = 0;
|
||||
static bool g_consoleAttrsInit = false;
|
||||
|
||||
static void InitConsoleDefaultAttrs()
|
||||
{
|
||||
if (g_consoleAttrsInit)
|
||||
return;
|
||||
|
||||
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
if (!hConsole || hConsole == INVALID_HANDLE_VALUE)
|
||||
return;
|
||||
|
||||
CONSOLE_SCREEN_BUFFER_INFO info;
|
||||
if (GetConsoleScreenBufferInfo(hConsole, &info))
|
||||
{
|
||||
g_consoleDefaultAttrs = info.wAttributes;
|
||||
g_consoleAttrsInit = true;
|
||||
}
|
||||
}
|
||||
|
||||
static void WriteConsoleColored(const char* text, WORD attrs)
|
||||
{
|
||||
if (!text)
|
||||
return;
|
||||
|
||||
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
if (!hConsole || hConsole == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
fputs(text, stdout);
|
||||
return;
|
||||
}
|
||||
|
||||
InitConsoleDefaultAttrs();
|
||||
if (g_consoleAttrsInit)
|
||||
SetConsoleTextAttribute(hConsole, attrs);
|
||||
|
||||
fputs(text, stdout);
|
||||
|
||||
if (g_consoleAttrsInit)
|
||||
SetConsoleTextAttribute(hConsole, g_consoleDefaultAttrs);
|
||||
}
|
||||
|
||||
static const WORD kConsoleSyserrRed = FOREGROUND_RED | FOREGROUND_INTENSITY;
|
||||
static const WORD kConsolePacketDumpDim = FOREGROUND_INTENSITY;
|
||||
static const WORD kConsoleTempTraceBg = BACKGROUND_BLUE | BACKGROUND_INTENSITY |
|
||||
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
|
||||
#endif
|
||||
// MR-11: -- END OF -- Colored console output for syserr and packet dumps
|
||||
|
||||
// Buffered log file writer
|
||||
// OPTIMIZATION: Buffered writes with periodic flush instead of per-write fflush()
|
||||
// - Collects writes in memory buffer
|
||||
@@ -171,6 +222,112 @@ class CLogFile : public CSingleton<CLogFile>
|
||||
|
||||
static CLogFile gs_logfile;
|
||||
|
||||
// MR-11: Separate packet dump log from the main log file
|
||||
class CExtraLogFile
|
||||
{
|
||||
public:
|
||||
CExtraLogFile() : m_fp(NULL), m_bufferPos(0), m_lastFlushMs(0) {}
|
||||
|
||||
~CExtraLogFile()
|
||||
{
|
||||
Flush();
|
||||
if (m_fp)
|
||||
fclose(m_fp);
|
||||
m_fp = NULL;
|
||||
}
|
||||
|
||||
bool Initialize(const char* path)
|
||||
{
|
||||
m_fp = fopen(path, "w");
|
||||
m_bufferPos = 0;
|
||||
m_lastFlushMs = ELTimer_GetMSec();
|
||||
return m_fp != NULL;
|
||||
}
|
||||
|
||||
bool IsOpen() const
|
||||
{
|
||||
return m_fp != NULL;
|
||||
}
|
||||
|
||||
void Write(const char* c_pszMsg)
|
||||
{
|
||||
if (!m_fp)
|
||||
return;
|
||||
|
||||
g_cachedTimestamp.Update();
|
||||
char timestamp[32];
|
||||
g_cachedTimestamp.Format(timestamp, sizeof(timestamp));
|
||||
|
||||
size_t timestampLen = strlen(timestamp);
|
||||
size_t msgLen = c_pszMsg ? strlen(c_pszMsg) : 0;
|
||||
size_t totalLen = timestampLen + msgLen;
|
||||
|
||||
if (m_bufferPos + totalLen >= BUFFER_SIZE - 1)
|
||||
Flush();
|
||||
|
||||
if (totalLen >= BUFFER_SIZE - 1)
|
||||
{
|
||||
fputs(timestamp, m_fp);
|
||||
if (c_pszMsg)
|
||||
fputs(c_pszMsg, m_fp);
|
||||
fflush(m_fp);
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(m_buffer + m_bufferPos, timestamp, timestampLen);
|
||||
m_bufferPos += timestampLen;
|
||||
if (msgLen > 0)
|
||||
{
|
||||
memcpy(m_buffer + m_bufferPos, c_pszMsg, msgLen);
|
||||
m_bufferPos += msgLen;
|
||||
}
|
||||
|
||||
DWORD now = ELTimer_GetMSec();
|
||||
if (now - m_lastFlushMs > 500 || m_bufferPos > BUFFER_SIZE * 3 / 4)
|
||||
Flush();
|
||||
}
|
||||
|
||||
void Flush()
|
||||
{
|
||||
if (!m_fp || m_bufferPos == 0)
|
||||
return;
|
||||
|
||||
m_buffer[m_bufferPos] = '\0';
|
||||
fputs(m_buffer, m_fp);
|
||||
fflush(m_fp);
|
||||
m_bufferPos = 0;
|
||||
m_lastFlushMs = ELTimer_GetMSec();
|
||||
}
|
||||
|
||||
private:
|
||||
static const size_t BUFFER_SIZE = 8192;
|
||||
FILE* m_fp;
|
||||
char m_buffer[BUFFER_SIZE];
|
||||
size_t m_bufferPos;
|
||||
DWORD m_lastFlushMs;
|
||||
};
|
||||
|
||||
#ifdef _PACKETDUMP
|
||||
static CExtraLogFile g_packetDumpFile;
|
||||
static CExtraLogFile g_pdlogFile;
|
||||
static bool g_packetDumpEnabled = false;
|
||||
static bool g_pdlogEnabled = false;
|
||||
static bool g_pdlogRequested = false;
|
||||
|
||||
static void EnsurePacketDumpFiles(bool enablePdlog)
|
||||
{
|
||||
if (!std::filesystem::exists("log"))
|
||||
std::filesystem::create_directory("log");
|
||||
|
||||
if (!g_packetDumpEnabled)
|
||||
g_packetDumpEnabled = g_packetDumpFile.Initialize("log/packetdump.txt");
|
||||
|
||||
if (enablePdlog && !g_pdlogEnabled)
|
||||
g_pdlogEnabled = g_pdlogFile.Initialize("log/pdlog.txt");
|
||||
}
|
||||
#endif
|
||||
// MR-11: -- END OF -- Separate packet dump log from the main log file
|
||||
|
||||
static UINT gs_uLevel = 0;
|
||||
|
||||
void SetLogLevel(UINT uLevel)
|
||||
@@ -360,6 +517,21 @@ static struct TSyserrBuffer
|
||||
}
|
||||
} g_syserrBuffer;
|
||||
|
||||
// MR-11: Seperate packet dump log from the main log file
|
||||
static void WriteSyserrPlain(const char* msg)
|
||||
{
|
||||
if (!msg)
|
||||
return;
|
||||
|
||||
g_cachedTimestamp.Update();
|
||||
char timestamp[32];
|
||||
g_cachedTimestamp.Format(timestamp, sizeof(timestamp));
|
||||
|
||||
g_syserrBuffer.Write(timestamp, strlen(timestamp));
|
||||
g_syserrBuffer.Write(msg, strlen(msg));
|
||||
}
|
||||
// MR-11: -- END OF -- Seperate packet dump log from the main log file
|
||||
|
||||
void TraceError(const char* c_szFormat, ...)
|
||||
{
|
||||
//#ifndef _DISTRIBUTE
|
||||
@@ -394,7 +566,7 @@ void TraceError(const char* c_szFormat, ...)
|
||||
|
||||
#ifdef _DEBUG
|
||||
DBG_OUT_W_UTF8(szBuf);
|
||||
fputs(szBuf, stdout);
|
||||
WriteConsoleColored(szBuf, kConsoleSyserrRed);
|
||||
#endif
|
||||
|
||||
if (isLogFile)
|
||||
@@ -423,7 +595,7 @@ void TraceErrorWithoutEnter(const char* c_szFormat, ...)
|
||||
|
||||
#ifdef _DEBUG
|
||||
DBG_OUT_W_UTF8(szBuf);
|
||||
fputs(szBuf, stdout);
|
||||
WriteConsoleColored(szBuf, kConsoleSyserrRed);
|
||||
#endif
|
||||
|
||||
if (isLogFile)
|
||||
@@ -431,6 +603,162 @@ void TraceErrorWithoutEnter(const char* c_szFormat, ...)
|
||||
//#endif
|
||||
}
|
||||
|
||||
// MR-11: Temporary trace functions for debugging (not for regular logging)
|
||||
void TempTrace(const char* c_szMsg, bool errType)
|
||||
{
|
||||
if (!c_szMsg)
|
||||
return;
|
||||
|
||||
#ifdef _DEBUG
|
||||
DBG_OUT_W_UTF8(c_szMsg);
|
||||
WriteConsoleColored(c_szMsg, kConsoleTempTraceBg);
|
||||
#endif
|
||||
|
||||
if (errType)
|
||||
{
|
||||
WriteSyserrPlain(c_szMsg);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isLogFile)
|
||||
LogFile(c_szMsg);
|
||||
}
|
||||
|
||||
void TempTracef(const char* c_szFormat, bool errType, ...)
|
||||
{
|
||||
char szBuf[DEBUG_STRING_MAX_LEN + 1];
|
||||
|
||||
va_list args;
|
||||
va_start(args, errType);
|
||||
_vsnprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, c_szFormat, args);
|
||||
va_end(args);
|
||||
|
||||
#ifdef _DEBUG
|
||||
DBG_OUT_W_UTF8(szBuf);
|
||||
WriteConsoleColored(szBuf, kConsoleTempTraceBg);
|
||||
#endif
|
||||
|
||||
if (errType)
|
||||
{
|
||||
WriteSyserrPlain(szBuf);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isLogFile)
|
||||
LogFile(szBuf);
|
||||
}
|
||||
|
||||
void TempTracen(const char* c_szMsg, bool errType)
|
||||
{
|
||||
if (!c_szMsg)
|
||||
return;
|
||||
|
||||
char szBuf[DEBUG_STRING_MAX_LEN + 2];
|
||||
_snprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, "%s\n", c_szMsg);
|
||||
|
||||
#ifdef _DEBUG
|
||||
DBG_OUT_W_UTF8(szBuf);
|
||||
WriteConsoleColored(szBuf, kConsoleTempTraceBg);
|
||||
#endif
|
||||
|
||||
if (errType)
|
||||
{
|
||||
WriteSyserrPlain(szBuf);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isLogFile)
|
||||
LogFile(szBuf);
|
||||
}
|
||||
|
||||
void TempTracenf(const char* c_szFormat, bool errType, ...)
|
||||
{
|
||||
char szBuf[DEBUG_STRING_MAX_LEN + 2];
|
||||
|
||||
va_list args;
|
||||
va_start(args, errType);
|
||||
_vsnprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, c_szFormat, args);
|
||||
va_end(args);
|
||||
|
||||
size_t cur = strnlen(szBuf, sizeof(szBuf));
|
||||
if (cur + 1 < sizeof(szBuf)) {
|
||||
szBuf[cur] = '\n';
|
||||
szBuf[cur + 1] = '\0';
|
||||
}
|
||||
else {
|
||||
szBuf[sizeof(szBuf) - 2] = '\n';
|
||||
szBuf[sizeof(szBuf) - 1] = '\0';
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
DBG_OUT_W_UTF8(szBuf);
|
||||
WriteConsoleColored(szBuf, kConsoleTempTraceBg);
|
||||
#endif
|
||||
|
||||
if (errType)
|
||||
{
|
||||
WriteSyserrPlain(szBuf);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isLogFile)
|
||||
LogFile(szBuf);
|
||||
}
|
||||
// MR-11: -- END OF -- Temporary trace functions for debugging (not for regular logging)
|
||||
|
||||
// MR-11: Seperate packet dump from the rest of the logs
|
||||
void PacketDump(const char* c_szMsg)
|
||||
{
|
||||
#ifdef _PACKETDUMP
|
||||
if (!c_szMsg)
|
||||
return;
|
||||
|
||||
PacketDumpf("%s", c_szMsg);
|
||||
#else
|
||||
(void)c_szMsg;
|
||||
#endif
|
||||
}
|
||||
|
||||
void PacketDumpf(const char* c_szFormat, ...)
|
||||
{
|
||||
#ifdef _PACKETDUMP
|
||||
char szBuf[DEBUG_STRING_MAX_LEN + 2];
|
||||
|
||||
strncpy_s(szBuf, sizeof(szBuf), "PACKET_DUMP: ", _TRUNCATE);
|
||||
int prefixLen = (int)strlen(szBuf);
|
||||
|
||||
va_list args;
|
||||
va_start(args, c_szFormat);
|
||||
_vsnprintf_s(szBuf + prefixLen, sizeof(szBuf) - prefixLen, _TRUNCATE, c_szFormat, args);
|
||||
va_end(args);
|
||||
|
||||
size_t cur = strnlen(szBuf, sizeof(szBuf));
|
||||
if (cur + 1 < sizeof(szBuf)) {
|
||||
szBuf[cur] = '\n';
|
||||
szBuf[cur + 1] = '\0';
|
||||
}
|
||||
else {
|
||||
szBuf[sizeof(szBuf) - 2] = '\n';
|
||||
szBuf[sizeof(szBuf) - 1] = '\0';
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
DBG_OUT_W_UTF8(szBuf);
|
||||
WriteConsoleColored(szBuf, kConsolePacketDumpDim);
|
||||
#endif
|
||||
|
||||
EnsurePacketDumpFiles(g_pdlogRequested);
|
||||
|
||||
if (g_packetDumpEnabled)
|
||||
g_packetDumpFile.Write(szBuf);
|
||||
if (g_pdlogEnabled)
|
||||
g_pdlogFile.Write(szBuf);
|
||||
#else
|
||||
(void)c_szFormat;
|
||||
#endif
|
||||
}
|
||||
// MR-11: -- END OF -- Seperate packet dump from the rest of the logs
|
||||
|
||||
void LogBoxf(const char* c_szFormat, ...)
|
||||
{
|
||||
va_list args;
|
||||
@@ -461,6 +789,13 @@ void LogBox(const char* c_szMsg, const char* c_szCaption, HWND hWnd)
|
||||
void LogFile(const char* c_szMsg)
|
||||
{
|
||||
CLogFile::Instance().Write(c_szMsg);
|
||||
|
||||
// MR-11: Separate packet dump log from the main log file
|
||||
#ifdef _PACKETDUMP
|
||||
if (g_pdlogEnabled)
|
||||
g_pdlogFile.Write(c_szMsg);
|
||||
#endif
|
||||
// MR-11: -- END OF -- Separate packet dump log from the main log file
|
||||
}
|
||||
|
||||
void LogFilef(const char* c_szMessage, ...)
|
||||
@@ -474,6 +809,13 @@ void LogFilef(const char* c_szMessage, ...)
|
||||
va_end(args);
|
||||
|
||||
CLogFile::Instance().Write(szBuf);
|
||||
|
||||
// MR-11: Separate packet dump log from the main log file
|
||||
#ifdef _PACKETDUMP
|
||||
if (g_pdlogEnabled)
|
||||
g_pdlogFile.Write(szBuf);
|
||||
#endif
|
||||
// MR-11: -- END OF -- Separate packet dump log from the main log file
|
||||
}
|
||||
|
||||
void OpenLogFile(bool bUseLogFIle)
|
||||
@@ -490,7 +832,13 @@ void OpenLogFile(bool bUseLogFIle)
|
||||
isLogFile = true;
|
||||
CLogFile::Instance().Initialize();
|
||||
}
|
||||
//#endif
|
||||
|
||||
// MR-11: Separate packet dump log from the main log file
|
||||
#ifdef _PACKETDUMP
|
||||
g_pdlogRequested = bUseLogFIle;
|
||||
EnsurePacketDumpFiles(g_pdlogRequested);
|
||||
#endif
|
||||
// MR-11: -- END OF -- Separate packet dump log from the main log file
|
||||
}
|
||||
|
||||
void CloseLogFile()
|
||||
@@ -498,6 +846,15 @@ void CloseLogFile()
|
||||
// Flush all buffered output before shutdown
|
||||
g_syserrBuffer.Flush();
|
||||
CLogFile::Instance().Flush();
|
||||
|
||||
// MR-11: Separate packet dump log from the main log file
|
||||
#ifdef _PACKETDUMP
|
||||
if (g_packetDumpEnabled)
|
||||
g_packetDumpFile.Flush();
|
||||
if (g_pdlogEnabled)
|
||||
g_pdlogFile.Flush();
|
||||
#endif
|
||||
// MR-11: -- END OF -- Separate packet dump log from the main log file
|
||||
}
|
||||
|
||||
void OpenConsoleWindow()
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#if defined(_DEBUG) && !defined(_PACKETDUMP)
|
||||
#define _PACKETDUMP
|
||||
#endif
|
||||
|
||||
extern void SetLogLevel(UINT uLevel);
|
||||
extern void Log(UINT uLevel, const char* c_szMsg);
|
||||
extern void Logn(UINT uLevel, const char* c_szMsg);
|
||||
@@ -15,6 +19,15 @@ extern void Tracenf(const char* c_szFormat, ...);
|
||||
extern void Tracef(const char* c_szFormat, ...);
|
||||
extern void TraceError(const char* c_szFormat, ...);
|
||||
extern void TraceErrorWithoutEnter(const char* c_szFormat, ...);
|
||||
// MR-11: Separate packet dump log from the main log file
|
||||
extern void TempTrace(const char* c_szMsg, bool errType = false);
|
||||
extern void TempTracef(const char* c_szFormat, bool errType = false, ...);
|
||||
extern void TempTracen(const char* c_szMsg, bool errType = false);
|
||||
extern void TempTracenf(const char* c_szFormat, bool errType = false, ...);
|
||||
|
||||
extern void PacketDump(const char* c_szMsg);
|
||||
extern void PacketDumpf(const char* c_szFormat, ...);
|
||||
// MR-11: -- END OF -- Separate packet dump log from the main log file
|
||||
|
||||
extern void LogBox(const char* c_szMsg, const char * c_szCaption = NULL, HWND hWnd = NULL);
|
||||
extern void LogBoxf(const char* c_szMsg, ...);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
|
||||
#ifdef _DEBUG
|
||||
#if defined(_DEBUG) && !defined(_PACKETDUMP)
|
||||
#define _PACKETDUMP
|
||||
#endif
|
||||
|
||||
@@ -513,11 +513,13 @@ bool CNetworkStream::Recv(int size, char * pDestBuf)
|
||||
#ifdef _PACKETDUMP
|
||||
if (size >= 2)
|
||||
{
|
||||
// MR-11: Separate packet dump log from the main log file
|
||||
const uint16_t kHeader = *reinterpret_cast<const uint16_t*>(pDestBuf);
|
||||
TraceError("RECV< %s 0x%04X (%d bytes)", GetHeaderName(kHeader), kHeader, size);
|
||||
PacketDumpf("RECV< %s 0x%04X (%d bytes)", GetHeaderName(kHeader), kHeader, size);
|
||||
|
||||
const auto contents = dump_hex(reinterpret_cast<const uint8_t*>(pDestBuf), size);
|
||||
TraceError("%s", contents.c_str());
|
||||
PacketDumpf("%s", contents.c_str());
|
||||
// MR-11: -- END OF -- Separate packet dump log from the main log file
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -564,11 +566,13 @@ bool CNetworkStream::Send(int size, const char * pSrcBuf)
|
||||
#ifdef _PACKETDUMP
|
||||
if (size >= 2)
|
||||
{
|
||||
// MR-11: Separate packet dump log from the main log file
|
||||
const uint16_t kHeader = *reinterpret_cast<const uint16_t*>(pSrcBuf);
|
||||
TraceError("SEND> %s 0x%04X (%d bytes)", GetHeaderName(kHeader), kHeader, size);
|
||||
PacketDumpf("SEND> %s 0x%04X (%d bytes)", GetHeaderName(kHeader), kHeader, size);
|
||||
|
||||
const auto contents = dump_hex(reinterpret_cast<const uint8_t*>(pSrcBuf), size);
|
||||
TraceError("%s", contents.c_str());
|
||||
PacketDumpf("%s", contents.c_str());
|
||||
// MR-11: -- END OF -- Separate packet dump log from the main log file
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -73,9 +73,11 @@ namespace UI
|
||||
CImageBox * pSignImage;
|
||||
CAniImageBox * pFinishCoolTimeEffect;
|
||||
} TSlot;
|
||||
|
||||
typedef std::list<TSlot> TSlotList;
|
||||
typedef TSlotList::iterator TSlotListIterator;
|
||||
typedef struct SStoreCoolDown { float fCoolTime; float fElapsedTime; bool bActive; };
|
||||
|
||||
struct SStoreCoolDown { float fCoolTime; float fElapsedTime; bool bActive; };
|
||||
|
||||
|
||||
public:
|
||||
@@ -121,13 +123,13 @@ namespace UI
|
||||
|
||||
void LockSlot(DWORD dwIndex);
|
||||
void UnlockSlot(DWORD dwIndex);
|
||||
BOOL IsLockSlot(DWORD dwIndex);
|
||||
// BOOL IsLockSlot(DWORD dwIndex);
|
||||
void SetCantUseSlot(DWORD dwIndex);
|
||||
void SetUseSlot(DWORD dwIndex);
|
||||
BOOL IsCantUseSlot(DWORD dwIndex);
|
||||
// BOOL IsCantUseSlot(DWORD dwIndex);
|
||||
void EnableSlot(DWORD dwIndex);
|
||||
void DisableSlot(DWORD dwIndex);
|
||||
BOOL IsEnableSlot(DWORD dwIndex);
|
||||
// BOOL IsEnableSlot(DWORD dwIndex);
|
||||
|
||||
// Select
|
||||
void ClearSelected();
|
||||
|
||||
@@ -49,6 +49,18 @@ PyObject* dbgTraceError(PyObject* poSelf, PyObject* poArgs)
|
||||
return Py_BuildNone();
|
||||
}
|
||||
|
||||
// MR-11: Temporary trace functions for debugging (not for regular logging)
|
||||
PyObject* dbgTraceTemp(PyObject* poSelf, PyObject* poArgs)
|
||||
{
|
||||
char* szMsg;
|
||||
if (!PyTuple_GetString(poArgs, 0, &szMsg))
|
||||
return Py_BuildException();
|
||||
|
||||
TempTrace(szMsg, false);
|
||||
return Py_BuildNone();
|
||||
}
|
||||
// MR-11: -- END OF -- Temporary trace functions for debugging (not for regular logging)
|
||||
|
||||
PyObject* dbgRegisterExceptionString(PyObject* poSelf, PyObject* poArgs)
|
||||
{
|
||||
char* szMsg;
|
||||
@@ -69,8 +81,11 @@ void initdbg()
|
||||
{ "Trace", dbgTrace, METH_VARARGS },
|
||||
{ "Tracen", dbgTracen, METH_VARARGS },
|
||||
{ "TraceError", dbgTraceError, METH_VARARGS },
|
||||
// MR-11: Temporary trace functions for debugging (not for regular logging)
|
||||
{ "TraceTemp", dbgTraceTemp, METH_VARARGS },
|
||||
// MR-11: -- END OF -- Temporary trace functions for debugging (not for regular logging)
|
||||
{ "RegisterExceptionString", dbgRegisterExceptionString, METH_VARARGS },
|
||||
{ NULL, NULL},
|
||||
{ NULL, NULL },
|
||||
};
|
||||
|
||||
Py_InitModule("dbg", s_methods);
|
||||
|
||||
Reference in New Issue
Block a user