mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 23:32:58 +00:00
[REACTOS] Introduce a "DEBUGFORMAT" environment variable that allows to select different debug trace formats.
CORE-12671 - The default format is used when no format name is specified: this is the one we use so far in ReactOS: <debug_class>:(<file>:<line>) <message> with "debug_class" being "trace", "warn", "err". - The "wine" format is the one used by Wine. It can be used when trying to diff-compare traces for a module with the corresponding one obtained from a Wine run. It can also be useful because the logging of Wine-synced code assumes that the function names are automatically added by the helper macros "FIXME()", "TRACE()", "WARN()" or "ERR()", and not manually inside the logging string given to these macros: for example: FIXME("(%params) message\n", params); displays: fixme:<module>:SomeFunc(params) message - The "extended" (or "ext") format is very noisy and tries to output a lot of information; it is a hybrid of the previous two formats: <debug_class>:(<file>:<line>):<channel>:SomeFunc <message> Support for displaying the current process ID is added in addition to the already existing support for thread ID.
This commit is contained in:
parent
c8749d379b
commit
cb979bb293
2 changed files with 108 additions and 6 deletions
|
@ -141,7 +141,7 @@ struct __wine_debug_channel
|
||||||
|
|
||||||
#define __WINE_DPRINTF(dbcl,dbch) \
|
#define __WINE_DPRINTF(dbcl,dbch) \
|
||||||
(!__WINE_GET_DEBUGGING(dbcl,(dbch)) || \
|
(!__WINE_GET_DEBUGGING(dbcl,(dbch)) || \
|
||||||
(ros_dbg_log(__WINE_DBCL##dbcl,(dbch),__FILE__,"",__LINE__,"") == -1)) ? \
|
(ros_dbg_log(__WINE_DBCL##dbcl,(dbch),__RELFILE__,__FUNCTION__,__LINE__,"") == -1)) ? \
|
||||||
(void)0 : (void)wine_dbg_printf
|
(void)0 : (void)wine_dbg_printf
|
||||||
|
|
||||||
#define __WINE_PRINTF_ATTR(fmt, args)
|
#define __WINE_PRINTF_ATTR(fmt, args)
|
||||||
|
|
112
sdk/lib/3rdparty/libwine/debug.c
vendored
112
sdk/lib/3rdparty/libwine/debug.c
vendored
|
@ -35,6 +35,7 @@
|
||||||
#include <rtlfuncs.h>
|
#include <rtlfuncs.h>
|
||||||
#include <cmfuncs.h>
|
#include <cmfuncs.h>
|
||||||
|
|
||||||
|
WINE_DECLARE_DEBUG_CHANNEL(pid);
|
||||||
WINE_DECLARE_DEBUG_CHANNEL(tid);
|
WINE_DECLARE_DEBUG_CHANNEL(tid);
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
|
@ -59,6 +60,18 @@ static struct __wine_debug_functions funcs;
|
||||||
|
|
||||||
static void debug_init(void);
|
static void debug_init(void);
|
||||||
|
|
||||||
|
|
||||||
|
/* Wine format */
|
||||||
|
static int winefmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
|
||||||
|
const char *file, const char *func, const int line, const char *format, va_list args );
|
||||||
|
/* ReactOS format (default) */
|
||||||
|
static int rosfmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
|
||||||
|
const char *file, const char *func, const int line, const char *format, va_list args );
|
||||||
|
/* Extended format */
|
||||||
|
static int extfmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
|
||||||
|
const char *file, const char *func, const int line, const char *format, va_list args );
|
||||||
|
|
||||||
|
|
||||||
static int __cdecl cmp_name( const void *p1, const void *p2 )
|
static int __cdecl cmp_name( const void *p1, const void *p2 )
|
||||||
{
|
{
|
||||||
const char *name = p1;
|
const char *name = p1;
|
||||||
|
@ -184,6 +197,25 @@ static void parse_options( const char *str )
|
||||||
free( options );
|
free( options );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The syntax of the DEBUGCHANNEL environment variable is:
|
||||||
|
* DEBUGCHANNEL=[class]+xxx,[class]-yyy,...
|
||||||
|
*
|
||||||
|
* For example: DEBUGCHANNEL=+all,warn-heap
|
||||||
|
* turns on all messages except warning heap messages.
|
||||||
|
*
|
||||||
|
* The available message classes are: err, warn, fixme, trace.
|
||||||
|
*
|
||||||
|
* In order to select a different debug trace format, the
|
||||||
|
* DEBUGFORMAT environment variable should be used:
|
||||||
|
*
|
||||||
|
* DEBUGFORMAT=fmt
|
||||||
|
*
|
||||||
|
* where fmt is the format name: 'wine', or 'extended' (abbreviation: 'ext').
|
||||||
|
* If no format or an invalid one is specified, the fall-back default format
|
||||||
|
* is used instead.
|
||||||
|
*/
|
||||||
|
|
||||||
/* initialize all options at startup */
|
/* initialize all options at startup */
|
||||||
static void debug_init(void)
|
static void debug_init(void)
|
||||||
{
|
{
|
||||||
|
@ -206,6 +238,34 @@ static void debug_init(void)
|
||||||
free(wine_debug);
|
free(wine_debug);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dwLength = GetEnvironmentVariableA("DEBUGFORMAT", NULL, 0);
|
||||||
|
if (dwLength)
|
||||||
|
{
|
||||||
|
wine_debug = malloc(dwLength);
|
||||||
|
if (wine_debug)
|
||||||
|
{
|
||||||
|
if (GetEnvironmentVariableA("DEBUGFORMAT", wine_debug, dwLength) < dwLength)
|
||||||
|
{
|
||||||
|
if (strcmp(wine_debug, "wine") == 0)
|
||||||
|
{
|
||||||
|
funcs.dbg_vlog = winefmt_default_dbg_vlog;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (strcmp(wine_debug, "extended") == 0 ||
|
||||||
|
strcmp(wine_debug, "ext") == 0)
|
||||||
|
{
|
||||||
|
funcs.dbg_vlog = extfmt_default_dbg_vlog;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
funcs.dbg_vlog = rosfmt_default_dbg_vlog;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(wine_debug);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SetLastError(LastError);
|
SetLastError(LastError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,19 +473,36 @@ static int default_dbg_vprintf( const char *format, va_list args )
|
||||||
|
|
||||||
|
|
||||||
/* default implementation of wine_dbg_vlog */
|
/* default implementation of wine_dbg_vlog */
|
||||||
static int default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
|
/* Wine format */
|
||||||
const char *file, const char *func, const int line, const char *format, va_list args )
|
static int winefmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
|
||||||
|
const char *file, const char *func, const int line, const char *format, va_list args )
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (TRACE_ON(pid))
|
||||||
|
ret += wine_dbg_printf( "%04x:", HandleToULong(NtCurrentTeb()->ClientId.UniqueProcess) );
|
||||||
|
ret += wine_dbg_printf( "%04x:", HandleToULong(NtCurrentTeb()->ClientId.UniqueThread) );
|
||||||
|
|
||||||
|
if (cls < sizeof(debug_classes)/sizeof(debug_classes[0]))
|
||||||
|
ret += wine_dbg_printf( "%s:%s:%s ", debug_classes[cls], channel->name, func );
|
||||||
|
if (format)
|
||||||
|
ret += funcs.dbg_vprintf( format, args );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
/* ReactOS format (default) */
|
||||||
|
static int rosfmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
|
||||||
|
const char *file, const char *func, const int line, const char *format, va_list args )
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (TRACE_ON(tid))
|
if (TRACE_ON(tid))
|
||||||
ret += wine_dbg_printf("%04x:", HandleToULong(NtCurrentTeb()->ClientId.UniqueThread));
|
ret += wine_dbg_printf( "%04x:", HandleToULong(NtCurrentTeb()->ClientId.UniqueThread) );
|
||||||
|
|
||||||
if (cls < sizeof(debug_classes)/sizeof(debug_classes[0]))
|
if (cls < sizeof(debug_classes)/sizeof(debug_classes[0]))
|
||||||
ret += wine_dbg_printf( "%s:", debug_classes[cls] );
|
ret += wine_dbg_printf( "%s:", debug_classes[cls] );
|
||||||
|
|
||||||
if (file && line)
|
if (file && line)
|
||||||
ret += wine_dbg_printf ( "(%s:%d) ", file, line );
|
ret += wine_dbg_printf( "(%s:%d) ", file, line );
|
||||||
else
|
else
|
||||||
ret += wine_dbg_printf( "%s:%s: ", channel->name, func );
|
ret += wine_dbg_printf( "%s:%s: ", channel->name, func );
|
||||||
|
|
||||||
|
@ -433,6 +510,31 @@ static int default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_ch
|
||||||
ret += funcs.dbg_vprintf( format, args );
|
ret += funcs.dbg_vprintf( format, args );
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
/* Extended format */
|
||||||
|
static int extfmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
|
||||||
|
const char *file, const char *func, const int line, const char *format, va_list args )
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (TRACE_ON(pid) || TRACE_ON(tid))
|
||||||
|
{
|
||||||
|
ret += wine_dbg_printf( "[%04x:%04x]:",
|
||||||
|
(TRACE_ON(pid) ? HandleToULong(NtCurrentTeb()->ClientId.UniqueProcess) : 0),
|
||||||
|
(TRACE_ON(tid) ? HandleToULong(NtCurrentTeb()->ClientId.UniqueThread) : 0) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cls < sizeof(debug_classes)/sizeof(debug_classes[0]))
|
||||||
|
ret += wine_dbg_printf( "%s:", debug_classes[cls] );
|
||||||
|
|
||||||
|
if (file && line)
|
||||||
|
ret += wine_dbg_printf( "(%s:%d):", file, line );
|
||||||
|
|
||||||
|
ret += wine_dbg_printf( "%s:%s ", channel->name, func );
|
||||||
|
|
||||||
|
if (format)
|
||||||
|
ret += funcs.dbg_vprintf( format, args );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* wrappers to use the function pointers */
|
/* wrappers to use the function pointers */
|
||||||
|
|
||||||
|
@ -460,5 +562,5 @@ static struct __wine_debug_functions funcs =
|
||||||
default_dbgstr_an,
|
default_dbgstr_an,
|
||||||
default_dbgstr_wn,
|
default_dbgstr_wn,
|
||||||
default_dbg_vprintf,
|
default_dbg_vprintf,
|
||||||
default_dbg_vlog
|
rosfmt_default_dbg_vlog
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue