* Remove the dumpLog function and associated code from debug.c

* Add a new function dbgDumpLog to dumpinfo.cpp for dumping the last debug messages
 * Add a debug output callback to dumpinfo.cpp which is used to fetch the debug messages and store them in a ring buffer


git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@5581 4a71c877-e1ca-e34f-864e-861f7616d084
master
Giel van Schijndel 2008-07-19 01:08:07 +00:00
parent 859196ed2c
commit ed3f1508b8
6 changed files with 80 additions and 52 deletions

View File

@ -22,6 +22,7 @@
#include <ctime> #include <ctime>
#include <string> #include <string>
#include <vector> #include <vector>
#include <deque>
#include <sstream> #include <sstream>
#include <physfs.h> #include <physfs.h>
#include "dumpinfo.h" #include "dumpinfo.h"
@ -40,24 +41,88 @@ extern "C"
# define PACKAGE_DISTRIBUTOR "UNKNOWN" # define PACKAGE_DISTRIBUTOR "UNKNOWN"
#endif #endif
static char* dbgHeader = NULL; static const std::size_t max_debug_messages = 20;
static void dumpstr(const DumpFileHandle file, const char * const str) static char* dbgHeader = NULL;
static std::deque<std::vector<char> > dbgMessages;
static void dumpstr(const DumpFileHandle file, const char * const str, std::size_t const size)
{ {
#if defined(WZ_OS_WIN) #if defined(WZ_OS_WIN)
DWORD lNumberOfBytesWritten; DWORD lNumberOfBytesWritten;
WriteFile(file, str, strlen(str), &lNumberOfBytesWritten, NULL); WriteFile(file, str, size, &lNumberOfBytesWritten, NULL);
#else #else
write(file, str, strlen(str)); write(file, str, size);
#endif #endif
} }
static void dumpstr(const DumpFileHandle file, const char * const str)
{
dumpstr(file, str, strlen(str));
}
static void dumpEOL(const DumpFileHandle file)
{
#if defined(WZ_OS_WIN)
dumpstr(file, "\r\n");
#else
dumpstr(file, "\n");
#endif
}
static void debug_exceptionhandler_data(void **, const char * const str)
{
ASSERT(str != NULL, "Empty string sent to debug callback");
// Push this message on the message list
const char * last = &str[strlen(str)];
// Strip finishing newlines
while (last != str
&& *(last - 1) == '\n')
{
--last;
}
dbgMessages.push_back(std::vector<char>(str, last));
// Ensure the message list's maximum size is maintained
while (dbgMessages.size() > max_debug_messages)
{
dbgMessages.pop_front();
}
}
void dbgDumpHeader(DumpFileHandle file) void dbgDumpHeader(DumpFileHandle file)
{ {
if (dbgHeader) if (dbgHeader)
{
dumpstr(file, dbgHeader); dumpstr(file, dbgHeader);
}
else else
dumpstr(file, "No debug header available (yet)!\n" ); {
dumpstr(file, "No debug header available (yet)!");
dumpEOL(file);
}
}
void dbgDumpLog(DumpFileHandle file)
{
unsigned int line_num = 1;
// Write all messages to the given file
for (std::deque<std::vector<char> >::const_iterator
msg = dbgMessages.begin();
msg != dbgMessages.end();
++msg)
{
dumpstr(file, "Log message: ");
dumpstr(file, &(*msg)[0], msg->size());
dumpEOL(file);
}
// Terminate with a separating newline
dumpEOL(file);
} }
static std::string getProgramPath(const char* programCommand) static std::string getProgramPath(const char* programCommand)
@ -183,5 +248,6 @@ static void createHeader(int const argc, char* argv[])
void dbgDumpInit(int argc, char* argv[]) void dbgDumpInit(int argc, char* argv[])
{ {
debug_register_callback(&debug_exceptionhandler_data, NULL, NULL, NULL );
createHeader(argc, argv); createHeader(argc, argv);
} }

View File

@ -36,6 +36,13 @@ typedef int DumpFileHandle;
extern void dbgDumpHeader(DumpFileHandle file); extern void dbgDumpHeader(DumpFileHandle file);
/** Dump last several debug log calls into given file descriptor.
* For exception handler.
*
* @param file file descriptor to write to.
*/
extern void dbgDumpLog(DumpFileHandle file);
extern void dbgDumpInit(int argc, char* argv[]); extern void dbgDumpInit(int argc, char* argv[]);
#if defined(__cplusplus) #if defined(__cplusplus)

View File

@ -608,7 +608,7 @@ static void posixExceptionHandler(int signum, siginfo_t * siginfo, WZ_DECL_UNUSE
write(dumpFile, signal, strlen(signal)); write(dumpFile, signal, strlen(signal));
write(dumpFile, "\n\n", 2); write(dumpFile, "\n\n", 2);
dumpLog(dumpFile); // dump out the last two log calls dbgDumpLog(dumpFile); // dump out the last several log calls
# if defined(__GLIBC__) # if defined(__GLIBC__)
// Dump raw backtrace in case GDB is not available or fails // Dump raw backtrace in case GDB is not available or fails

View File

@ -1021,7 +1021,7 @@ void GenerateExceptionReport(PEXCEPTION_POINTERS pExceptionInfo)
rprintf(".\r\n\r\n"); rprintf(".\r\n\r\n");
dumpLog(hReportFile); dbgDumpLog(hReportFile);
pContext = pExceptionInfo->ContextRecord; pContext = pExceptionInfo->ContextRecord;

View File

@ -276,44 +276,6 @@ BOOL debug_enable_switch(const char *str)
return (part != LOG_LAST); return (part != LOG_LAST);
} }
/* Dump last two debug log calls into file descriptor. For exception handler. */
#if defined(WZ_OS_WIN)
static inline void dumpstr(HANDLE file, const char* str)
{
DWORD lNumberOfBytesWritten;
WriteFile(file, str, strnlen1(str, MAX_LEN_LOG_LINE) - 1, &lNumberOfBytesWritten, NULL);
}
static inline void dumpEOL(HANDLE file)
{
DWORD lNumberOfBytesWritten;
WriteFile(file, "\r\n", strlen("\r\n"), &lNumberOfBytesWritten, NULL);
}
#else
static inline void dumpstr(int file, const char* str)
{
write(file, str, strnlen1(str, MAX_LEN_LOG_LINE) - 1);
}
static inline void dumpEOL(int file)
{
write(file, "\n", strlen("\n"));
}
#endif
#if defined(WZ_OS_WIN)
void dumpLog(HANDLE file)
#else
void dumpLog(int file)
#endif
{
dumpstr(file, "Log message 1: ");
dumpstr(file, inputBuffer[0]);
dumpEOL(file);
dumpstr(file, "Log message 2: ");
dumpstr(file, inputBuffer[1]);
dumpEOL(file);
dumpEOL(file);
}
/** Send the given string to all debug callbacks. /** Send the given string to all debug callbacks.
* *
* @param str The string to send to debug callbacks. * @param str The string to send to debug callbacks.

View File

@ -190,13 +190,6 @@ static inline void objTraceDisable(void) { traceID = (UDWORD)-1; }
} }
#endif #endif
/** Dump last two debug log calls into given file descriptor. For exception handler. */
#if defined(WZ_OS_WIN)
extern void dumpLog(HANDLE file);
#else
extern void dumpLog(int file);
#endif
/** Checks if a particular debub flag was enabled */ /** Checks if a particular debub flag was enabled */
extern bool debugPartEnabled(code_part codePart); extern bool debugPartEnabled(code_part codePart);