Commit 8bc1d837 authored by Alexandre Julliard's avatar Alexandre Julliard

Use a per-thread buffer and write(2) for debug traces.

Removed debug_dumpstr.
parent 6a9f1906
......@@ -15,11 +15,10 @@
#include "builtin16.h"
#include "task.h"
#include "syslevel.h"
#include "debugstr.h"
#include "debugtools.h"
#include "main.h"
DEFAULT_DEBUG_CHANNEL(relay)
DEFAULT_DEBUG_CHANNEL(relay);
/***********************************************************************
* RELAY_Init
......@@ -143,20 +142,14 @@ void RELAY_DebugCallFrom16( CONTEXT86 *context )
DPRINTF( "0x%08x", *(int *)args16 );
args16 += 4;
break;
case 't':
DPRINTF( "%04x:%04x", *(WORD *)(args16+2), *(WORD *)args16 );
if (HIWORD(*(SEGPTR *)args16))
debug_dumpstr( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 ));
args16 += 4;
break;
case 'p':
DPRINTF( "%04x:%04x", *(WORD *)(args16+2), *(WORD *)args16 );
args16 += 4;
break;
case 't':
case 'T':
DPRINTF( "%04x:%04x", *(WORD *)(args16+2), *(WORD *)args16 );
if (HIWORD( *(SEGPTR *)args16 ))
debug_dumpstr( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 ));
DPRINTF( "%04x:%04x %s", *(WORD *)(args16+2), *(WORD *)args16,
debugres_a( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 )) );
args16 += 4;
break;
}
......@@ -199,9 +192,8 @@ void RELAY_DebugCallFrom16( CONTEXT86 *context )
break;
case 't':
args16 -= 4;
DPRINTF( "0x%08x", *(int *)args16 );
if (HIWORD(*(SEGPTR *)args16))
debug_dumpstr( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 ));
DPRINTF( "0x%08x %s", *(int *)args16,
debugres_a( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 )));
break;
case 'p':
args16 -= 4;
......@@ -209,9 +201,8 @@ void RELAY_DebugCallFrom16( CONTEXT86 *context )
break;
case 'T':
args16 -= 4;
DPRINTF( "%04x:%04x", *(WORD *)(args16+2), *(WORD *)args16 );
if (HIWORD( *(SEGPTR *)args16 ))
debug_dumpstr( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 ));
DPRINTF( "%04x:%04x %s", *(WORD *)(args16+2), *(WORD *)args16,
debugres_a( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 )));
break;
}
args++;
......
......@@ -4,12 +4,15 @@
#ifdef __WINE__ /* Debugging interface is internal to Wine */
#include <stdarg.h>
#include <stdio.h>
#include "config.h"
#include "debugstr.h"
#include "windef.h"
#define DEBUG_RUNTIME
struct _GUID;
/* Internal definitions (do not use these directly) */
enum __DEBUG_CLASS { __DBCL_FIXME, __DBCL_ERR, __DBCL_WARN, __DBCL_TRACE, __DBCL_COUNT };
......@@ -36,6 +39,25 @@ extern const char * const debug_ch_name[];
/* Exported definitions and macros */
/* These function return a printable version of a string, including
quotes. The string will be valid for some time, but not indefinitely
as strings are re-used. */
extern LPSTR debugstr_an (LPCSTR s, int n);
extern LPSTR debugstr_a (LPCSTR s);
extern LPSTR debugstr_wn (LPCWSTR s, int n);
extern LPSTR debugstr_w (LPCWSTR s);
extern LPSTR debugres_a (LPCSTR res);
extern LPSTR debugres_w (LPCWSTR res);
extern LPSTR debugstr_guid( const struct _GUID *id );
extern LPSTR debugstr_hex_dump (const void *ptr, int len);
extern int dbg_vprintf( const char *format, va_list args );
#ifdef __GNUC__
extern int dbg_printf(const char *format, ...) __attribute__((format (printf,1,2)));
#else
extern int dbg_printf(const char *format, ...);
#endif
/* use configure to allow user to compile out debugging messages */
#ifndef NO_TRACE_MSGS
#define TRACE __DPRINTF(__DBCL_TRACE,*DBCH_DEFAULT)
......
......@@ -94,10 +94,11 @@ typedef struct _TEB
int socket; /* --3 204 Socket for server communication */
void *buffer; /* --3 208 Buffer shared with server */
int buffer_size; /* --3 20c Size of server buffer */
void *debug_info; /* --3 210 Info for debugstr functions */
/* here is plenty space for wine specific fields (don't forget to change pad6!!) */
/* the following are nt specific fields */
DWORD pad6[634]; /* --n 210 */
DWORD pad6[633]; /* --n 214 */
UNICODE_STRING StaticUnicodeString; /* -2- bf8 used by advapi32 */
USHORT StaticUnicodeBuffer[261]; /* -2- c00 used by advapi32 */
DWORD pad7; /* --n e0c */
......
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include "debugstr.h"
#include "debugtools.h"
#include "wtypes.h"
#include "xmalloc.h"
#include "thread.h"
/* ---------------------------------------------------------------------- */
#define SAVE_STRING_COUNT 50
static void *strings[SAVE_STRING_COUNT];
static int nextstring;
struct debug_info
{
char *str_pos; /* current position in strings buffer */
char *out_pos; /* current position in output buffer */
char strings[500]; /* buffer for temporary strings */
char output[500]; /* current output line */
};
static inline struct debug_info *get_info(void)
{
struct debug_info *info = NtCurrentTeb()->debug_info;
if (!info)
{
NtCurrentTeb()->debug_info = info = HeapAlloc( GetProcessHeap(), 0, sizeof(*info) );
info->str_pos = info->strings;
info->out_pos = info->output;
}
return info;
}
/* ---------------------------------------------------------------------- */
static void *
gimme1 (int n)
{
void *res;
if (strings[nextstring]) free (strings[nextstring]);
res = strings[nextstring] = xmalloc (n);
if (++nextstring == SAVE_STRING_COUNT) nextstring = 0;
return res;
struct debug_info *info = get_info();
char *res = info->str_pos;
if (res + n >= &info->strings[sizeof(info->strings)]) res = info->strings;
info->str_pos = res + n;
return res;
}
/* ---------------------------------------------------------------------- */
......@@ -176,39 +192,23 @@ LPSTR debugstr_guid( const GUID *id )
/* ---------------------------------------------------------------------- */
void debug_dumpstr (LPCSTR s)
int dbg_vprintf( const char *format, va_list args )
{
fputc ('"', stderr);
while (*s)
struct debug_info *info = get_info();
int ret = vsprintf( info->out_pos, format, args );
char *p = strrchr( info->out_pos, '\n' );
if (!p) info->out_pos += ret;
else
{
switch (*s)
{
case '\\':
case '"':
fputc ('\\', stderr);
fputc (*s, stderr);
break;
case '\n':
fputc ('\\', stderr);
fputc ('n', stderr);
break;
case '\r':
fputc ('\\', stderr);
fputc ('r', stderr);
break;
case '\t':
fputc ('\\', stderr);
fputc ('t', stderr);
break;
default:
if (*s<' ')
fprintf (stderr, "\\0x%02x", *s);
else
fputc (*s, stderr);
}
s++;
char *pos = info->output;
p++;
write( 2, pos, p - pos );
/* move beginning of next line to start of buffer */
while ((*pos = *p++)) pos++;
info->out_pos = pos;
}
fputc ('"', stderr);
return ret;
}
/* ---------------------------------------------------------------------- */
......@@ -219,7 +219,7 @@ int dbg_printf(const char *format, ...)
va_list valist;
va_start(valist, format);
ret = vfprintf(stderr, format, valist);
ret = dbg_vprintf( format, valist);
va_end(valist);
return ret;
}
......
......@@ -165,6 +165,7 @@ void CALLBACK THREAD_FreeTEB( ULONG_PTR arg )
SELECTOR_FreeBlock( teb->teb_sel, 1 );
close( teb->socket );
if (teb->buffer) munmap( teb->buffer, teb->buffer_size );
if (teb->debug_info) HeapFree( GetProcessHeap(), 0, teb->debug_info );
VirtualFree( teb->stack_base, 0, MEM_RELEASE );
VirtualFree( teb, 0, MEM_FREE );
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment