Fixed %p in printf (now using wsprintf which doesn't support it).

Added ThreadId and ProcessId internal vars.
Allow at startup to pick up a process to debug.
This commit is contained in:
Eric Pouech 2000-05-11 21:43:43 +00:00 committed by Alexandre Julliard
parent 3de3cad9ce
commit f1822356b5
8 changed files with 84 additions and 41 deletions

View File

@ -451,7 +451,7 @@ BOOL DEBUG_Main( BOOL is_debug, BOOL force, DWORD code )
DEBUG_Printf( DBG_CHN_MESG, " in 16-bit code (%04x:%04lx).\n", DEBUG_Printf( DBG_CHN_MESG, " in 16-bit code (%04x:%04lx).\n",
(WORD)DEBUG_context.SegCs, DEBUG_context.Eip ); (WORD)DEBUG_context.SegCs, DEBUG_context.Eip );
#else #else
DEBUG_Printf( DBG_CHN_MESG, " (%p).\n", GET_IP(&DEBUG_context) ); DEBUG_Printf( DBG_CHN_MESG, " (0x%08lx).\n", GET_IP(&DEBUG_context) );
#endif #endif
} }

View File

@ -177,6 +177,8 @@ typedef struct tagDBG_PROCESS {
extern DBG_PROCESS* DEBUG_CurrProcess; extern DBG_PROCESS* DEBUG_CurrProcess;
extern DBG_THREAD* DEBUG_CurrThread; extern DBG_THREAD* DEBUG_CurrThread;
extern DWORD DEBUG_CurrTid;
extern DWORD DEBUG_CurrPid;
extern CONTEXT DEBUG_context; extern CONTEXT DEBUG_context;
#define DEBUG_READ_MEM(addr, buf, len) \ #define DEBUG_READ_MEM(addr, buf, len) \
@ -434,7 +436,11 @@ extern void DEBUG_Disassemble( const DBG_VALUE *, const DBG_VALUE*, int offset )
#define DBG_CHN_FIXME 8 #define DBG_CHN_FIXME 8
#define DBG_CHN_TRACE 16 #define DBG_CHN_TRACE 16
extern void DEBUG_Output(int chn, const char* buffer, int len); extern void DEBUG_Output(int chn, const char* buffer, int len);
#ifdef __GNUC__
extern int DEBUG_Printf(int chn, const char* format, ...) __attribute__((format (printf,2,3)));
#else
extern int DEBUG_Printf(int chn, const char* format, ...); extern int DEBUG_Printf(int chn, const char* format, ...);
#endif
extern DBG_INTVAR* DEBUG_GetIntVar(const char*); extern DBG_INTVAR* DEBUG_GetIntVar(const char*);
/* Choose your allocator! */ /* Choose your allocator! */

View File

@ -444,14 +444,17 @@ void DEBUG_WalkProcess(void)
{ {
PROCESSENTRY32 entry; PROCESSENTRY32 entry;
DWORD current = DEBUG_CurrProcess ? DEBUG_CurrProcess->pid : 0; DWORD current = DEBUG_CurrProcess ? DEBUG_CurrProcess->pid : 0;
BOOL ok = Process32First( snap, &entry ); BOOL ok;
entry.dwSize = sizeof(entry);
ok = Process32First( snap, &entry );
DEBUG_Printf(DBG_CHN_MESG, "%-8.8s %-8.8s %-8.8s %s\n", DEBUG_Printf(DBG_CHN_MESG, "%-8.8s %-8.8s %-8.8s %s\n",
"pid", "threads", "parent", "exe" ); "pid", "threads", "parent", "exe" );
while (ok) while (ok)
{ {
if (entry.th32ProcessID != GetCurrentProcessId()) if (entry.th32ProcessID != GetCurrentProcessId())
DEBUG_Printf(DBG_CHN_MESG, "%08lx %8d %08lx '%s'%s\n", DEBUG_Printf(DBG_CHN_MESG, "%08lx %8ld %08lx '%s'%s\n",
entry.th32ProcessID, entry.cntThreads, entry.th32ProcessID, entry.cntThreads,
entry.th32ParentProcessID, entry.szExeFile, entry.th32ParentProcessID, entry.szExeFile,
(entry.th32ProcessID == current) ? " <==" : "" ); (entry.th32ProcessID == current) ? " <==" : "" );
@ -468,7 +471,10 @@ void DEBUG_WalkThreads(void)
{ {
THREADENTRY32 entry; THREADENTRY32 entry;
DWORD current = DEBUG_CurrThread ? DEBUG_CurrThread->tid : 0; DWORD current = DEBUG_CurrThread ? DEBUG_CurrThread->tid : 0;
BOOL ok = Thread32First( snap, &entry ); BOOL ok;
entry.dwSize = sizeof(entry);
ok = Thread32First( snap, &entry );
DEBUG_Printf(DBG_CHN_MESG, "%-8.8s %-8.8s %s\n", DEBUG_Printf(DBG_CHN_MESG, "%-8.8s %-8.8s %s\n",
"tid", "process", "prio" ); "tid", "process", "prio" );

View File

@ -18,6 +18,10 @@ INTERNAL_VAR(UseXTerm, TRUE, NULL, DEBUG_TypeIntConst)
/* debugging debugger */ /* debugging debugger */
INTERNAL_VAR(ExtDbgOnInvalidAddress, FALSE, NULL, DEBUG_TypeIntConst) INTERNAL_VAR(ExtDbgOnInvalidAddress, FALSE, NULL, DEBUG_TypeIntConst)
/* current process/thread */
INTERNAL_VAR(ThreadId, FALSE, &DEBUG_CurrTid, DEBUG_TypeIntConst)
INTERNAL_VAR(ProcessId, FALSE, &DEBUG_CurrPid, DEBUG_TypeIntConst)
/* context manipulation */ /* context manipulation */
#ifdef __i386__ #ifdef __i386__
/* FIXME: 16 bit registers use imply that CPU is little endian, which is /* FIXME: 16 bit registers use imply that CPU is little endian, which is

View File

@ -599,7 +599,8 @@ DEBUG_ParseTypedefStab(char * ptr, const char * typename)
} }
else else
{ {
DEBUG_Printf(DBG_CHN_MESG, "Unknown condition %p %p (%s)\n", *dt, *dt2, ptr); DEBUG_Printf(DBG_CHN_MESG, "Unknown condition %08lx %08lx (%s)\n",
(unsigned long)*dt, (unsigned long)*dt2, ptr);
} }
if( *tc == '\0' ) if( *tc == '\0' )
*c = '\0'; *c = '\0';
@ -1229,7 +1230,7 @@ DEBUG_ProcessElfObject(const char * filename, unsigned int load_offset)
if (DEBUG_FindModuleByName(filename, DM_TYPE_ELF)) if (DEBUG_FindModuleByName(filename, DM_TYPE_ELF))
goto leave; goto leave;
DEBUG_Printf(DBG_CHN_MESG, "Loading stabs debug symbols from %s (0x%08lx)\n", DEBUG_Printf(DBG_CHN_MESG, "Loading stabs debug symbols from %s (0x%08x)\n",
filename, load_offset); filename, load_offset);
/* /*
@ -1404,7 +1405,7 @@ DEBUG_ReadExecutableDbgInfo(const char* exe_name)
DBG_VALUE value; DBG_VALUE value;
DEBUG_Printf(DBG_CHN_TRACE, "Setting up a breakpoint on r_brk(%lx)\n", DEBUG_Printf(DBG_CHN_TRACE, "Setting up a breakpoint on r_brk(%lx)\n",
dbg_hdr.r_brk); (unsigned long)dbg_hdr.r_brk);
DEBUG_SetBreakpoints(FALSE); DEBUG_SetBreakpoints(FALSE);
value.type = NULL; value.type = NULL;

View File

@ -273,8 +273,8 @@ void DEBUG_BackTrace(BOOL noisy)
if (is16) { if (is16) {
if (!DEBUG_READ_MEM((void*)next_switch, &frame32, sizeof(STACK32FRAME))) { if (!DEBUG_READ_MEM((void*)next_switch, &frame32, sizeof(STACK32FRAME))) {
if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame %p\n", if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame 0x%08lx\n",
(STACK32FRAME*)next_switch ); (unsigned long)(STACK32FRAME*)next_switch );
return; return;
} }
cur_switch = (DWORD)frame32.frame16; cur_switch = (DWORD)frame32.frame16;
@ -286,7 +286,8 @@ void DEBUG_BackTrace(BOOL noisy)
p = DEBUG_ToLinear(&tmp); p = DEBUG_ToLinear(&tmp);
if (!DEBUG_READ_MEM((void*)p, &frame16, sizeof(STACK16FRAME))) { if (!DEBUG_READ_MEM((void*)p, &frame16, sizeof(STACK16FRAME))) {
if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame %p\n", (STACK16FRAME*)p ); if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame 0x%08lx\n",
(unsigned long)(STACK16FRAME*)p );
return; return;
} }
cur_switch = (DWORD)frame16.frame32; cur_switch = (DWORD)frame16.frame32;
@ -306,7 +307,8 @@ void DEBUG_BackTrace(BOOL noisy)
if (is16) { if (is16) {
if (!DEBUG_READ_MEM((void*)next_switch, &frame32, sizeof(STACK32FRAME))) { if (!DEBUG_READ_MEM((void*)next_switch, &frame32, sizeof(STACK32FRAME))) {
if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame %p\n", (STACK32FRAME*)next_switch ); if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame 0x%08lx\n",
(unsigned long)(STACK32FRAME*)next_switch );
return; return;
} }
@ -324,8 +326,8 @@ void DEBUG_BackTrace(BOOL noisy)
p = DEBUG_ToLinear(&tmp); p = DEBUG_ToLinear(&tmp);
if (!DEBUG_READ_MEM((void*)p, &frame16, sizeof(STACK16FRAME))) { if (!DEBUG_READ_MEM((void*)p, &frame16, sizeof(STACK16FRAME))) {
if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame %p\n", if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame 0x%08lx\n",
(STACK16FRAME*)p ); (unsigned long)(STACK16FRAME*)p );
return; return;
} }
cur_switch = (DWORD)frame16.frame32; cur_switch = (DWORD)frame16.frame32;
@ -339,8 +341,8 @@ void DEBUG_BackTrace(BOOL noisy)
p = DEBUG_ToLinear(&tmp); p = DEBUG_ToLinear(&tmp);
if (!DEBUG_READ_MEM((void*)p, &frame16, sizeof(STACK16FRAME))) { if (!DEBUG_READ_MEM((void*)p, &frame16, sizeof(STACK16FRAME))) {
if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame %p\n", if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame 0x%08lx\n",
(STACK16FRAME*)p ); (unsigned long)(STACK16FRAME*)p );
return; return;
} }
@ -354,8 +356,8 @@ void DEBUG_BackTrace(BOOL noisy)
next_switch = cur_switch; next_switch = cur_switch;
if (!DEBUG_READ_MEM((void*)next_switch, &frame32, sizeof(STACK32FRAME))) { if (!DEBUG_READ_MEM((void*)next_switch, &frame32, sizeof(STACK32FRAME))) {
if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame %p\n", if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad stack frame 0x%08lx\n",
(STACK32FRAME*)next_switch ); (unsigned long)(STACK32FRAME*)next_switch );
return; return;
} }
cur_switch = (DWORD)frame32.frame16; cur_switch = (DWORD)frame32.frame16;

View File

@ -933,12 +933,12 @@ DEBUG_DumpTypes(void)
switch(dt->type) switch(dt->type)
{ {
case DT_BASIC: case DT_BASIC:
DEBUG_Printf(DBG_CHN_MESG, "0x%p - BASIC(%s)\n", DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - BASIC(%s)\n",
dt, name); (unsigned long)dt, name);
break; break;
case DT_POINTER: case DT_POINTER:
DEBUG_Printf(DBG_CHN_MESG, "0x%p - POINTER(%s)(%p)\n", DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - POINTER(%s)(%08lx)\n",
dt, name, dt->un.pointer.pointsto); (unsigned long)dt, name, (unsigned long)dt->un.pointer.pointsto);
break; break;
case DT_STRUCT: case DT_STRUCT:
member_name = "none"; member_name = "none";
@ -952,22 +952,24 @@ DEBUG_DumpTypes(void)
nm++; nm++;
} }
} }
DEBUG_Printf(DBG_CHN_MESG, "0x%p - STRUCT(%s) %d %d %s\n", dt, name, DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - STRUCT(%s) %d %d %s\n",
dt->un.structure.size, nm, member_name); (unsigned long)dt, name, dt->un.structure.size, nm, member_name);
break; break;
case DT_ARRAY: case DT_ARRAY:
DEBUG_Printf(DBG_CHN_MESG, "0x%p - ARRAY(%s)(%p)\n", DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - ARRAY(%s)(%08lx)\n",
dt, name, dt->un.array.basictype); (unsigned long)dt, name, (unsigned long)dt->un.array.basictype);
break; break;
case DT_ENUM: case DT_ENUM:
DEBUG_Printf(DBG_CHN_MESG, "0x%p - ENUM(%s)\n", dt, name); DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - ENUM(%s)\n",
(unsigned long)dt, name);
break; break;
case DT_BITFIELD: case DT_BITFIELD:
DEBUG_Printf(DBG_CHN_MESG, "0x%p - BITFIELD(%s)\n", dt, name); DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - BITFIELD(%s)\n",
(unsigned long)dt, name);
break; break;
case DT_FUNC: case DT_FUNC:
DEBUG_Printf(DBG_CHN_MESG, "0x%p - FUNC(%s)(%p)\n", DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - FUNC(%s)(%08lx)\n",
dt, name, dt->un.funct.rettype); (unsigned long)dt, name, (unsigned long)dt->un.funct.rettype);
break; break;
case DT_CONST: case DT_CONST:
case DT_TYPEDEF: case DT_TYPEDEF:

View File

@ -24,6 +24,8 @@ HANDLE dbg_heap = 0;
DBG_PROCESS* DEBUG_CurrProcess = NULL; DBG_PROCESS* DEBUG_CurrProcess = NULL;
DBG_THREAD* DEBUG_CurrThread = NULL; DBG_THREAD* DEBUG_CurrThread = NULL;
DWORD DEBUG_CurrTid;
DWORD DEBUG_CurrPid;
CONTEXT DEBUG_context; CONTEXT DEBUG_context;
static DBG_PROCESS* proc = NULL; static DBG_PROCESS* proc = NULL;
@ -74,8 +76,7 @@ static BOOL DEBUG_IntVarsRW(int read)
#undef INTERNAL_VAR #undef INTERNAL_VAR
} }
if (RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\WineDbg", &hkey) && if (RegCreateKeyA(HKEY_CURRENT_USER, "Software\\Wine\\WineDbg", &hkey)) {
RegCreateKeyA(HKEY_CURRENT_USER, "Software\\Wine\\WineDbg", &hkey)) {
/* since the IVars are not yet setup, DEBUG_Printf doesn't work, /* since the IVars are not yet setup, DEBUG_Printf doesn't work,
* so don't use it */ * so don't use it */
fprintf(stderr, "Cannot create WineDbg key in registry\n"); fprintf(stderr, "Cannot create WineDbg key in registry\n");
@ -343,6 +344,9 @@ static BOOL DEBUG_HandleDebugEvent(DEBUG_EVENT* de, LPDWORD cont)
char buffer[256]; char buffer[256];
BOOL ret; BOOL ret;
DEBUG_CurrPid = de->dwProcessId;
DEBUG_CurrTid = de->dwThreadId;
__TRY { __TRY {
ret = TRUE; ret = TRUE;
*cont = 0L; *cont = 0L;
@ -390,8 +394,8 @@ static BOOL DEBUG_HandleDebugEvent(DEBUG_EVENT* de, LPDWORD cont)
break; break;
case CREATE_THREAD_DEBUG_EVENT: case CREATE_THREAD_DEBUG_EVENT:
DEBUG_Printf(DBG_CHN_TRACE, "%08lx:%08lx: create thread D @%p\n", de->dwProcessId, de->dwThreadId, DEBUG_Printf(DBG_CHN_TRACE, "%08lx:%08lx: create thread D @%08lx\n", de->dwProcessId, de->dwThreadId,
de->u.CreateThread.lpStartAddress); (unsigned long)(LPVOID)de->u.CreateThread.lpStartAddress);
if (DEBUG_CurrProcess == NULL) { if (DEBUG_CurrProcess == NULL) {
DEBUG_Printf(DBG_CHN_ERR, "Unknown process\n"); DEBUG_Printf(DBG_CHN_ERR, "Unknown process\n");
@ -420,10 +424,10 @@ static BOOL DEBUG_HandleDebugEvent(DEBUG_EVENT* de, LPDWORD cont)
de->u.CreateProcessInfo.lpImageName); de->u.CreateProcessInfo.lpImageName);
/* FIXME unicode ? de->u.CreateProcessInfo.fUnicode */ /* FIXME unicode ? de->u.CreateProcessInfo.fUnicode */
DEBUG_Printf(DBG_CHN_TRACE, "%08lx:%08lx: create process %s @%p (%ld<%ld>)\n", DEBUG_Printf(DBG_CHN_TRACE, "%08lx:%08lx: create process %s @%08lx (%ld<%ld>)\n",
de->dwProcessId, de->dwThreadId, de->dwProcessId, de->dwThreadId,
buffer, buffer,
de->u.CreateProcessInfo.lpStartAddress, (unsigned long)(LPVOID)de->u.CreateProcessInfo.lpStartAddress,
de->u.CreateProcessInfo.dwDebugInfoFileOffset, de->u.CreateProcessInfo.dwDebugInfoFileOffset,
de->u.CreateProcessInfo.nDebugInfoSize); de->u.CreateProcessInfo.nDebugInfoSize);
@ -442,9 +446,9 @@ static BOOL DEBUG_HandleDebugEvent(DEBUG_EVENT* de, LPDWORD cont)
} }
} }
DEBUG_Printf(DBG_CHN_TRACE, "%08lx:%08lx: create thread I @%p\n", DEBUG_Printf(DBG_CHN_TRACE, "%08lx:%08lx: create thread I @%08lx\n",
de->dwProcessId, de->dwThreadId, de->dwProcessId, de->dwThreadId,
de->u.CreateProcessInfo.lpStartAddress); (unsigned long)(LPVOID)de->u.CreateProcessInfo.lpStartAddress);
DEBUG_CurrThread = DEBUG_AddThread(DEBUG_CurrProcess, DEBUG_CurrThread = DEBUG_AddThread(DEBUG_CurrProcess,
de->dwThreadId, de->dwThreadId,
@ -501,9 +505,9 @@ static BOOL DEBUG_HandleDebugEvent(DEBUG_EVENT* de, LPDWORD cont)
de->u.LoadDll.lpImageName); de->u.LoadDll.lpImageName);
/* FIXME unicode: de->u.LoadDll.fUnicode */ /* FIXME unicode: de->u.LoadDll.fUnicode */
DEBUG_Printf(DBG_CHN_TRACE, "%08lx:%08lx: loads DLL %s @%p (%ld<%ld>)\n", DEBUG_Printf(DBG_CHN_TRACE, "%08lx:%08lx: loads DLL %s @%08lx (%ld<%ld>)\n",
de->dwProcessId, de->dwThreadId, de->dwProcessId, de->dwThreadId,
buffer, de->u.LoadDll.lpBaseOfDll, buffer, (unsigned long)de->u.LoadDll.lpBaseOfDll,
de->u.LoadDll.dwDebugInfoFileOffset, de->u.LoadDll.dwDebugInfoFileOffset,
de->u.LoadDll.nDebugInfoSize); de->u.LoadDll.nDebugInfoSize);
CharUpper(buffer); CharUpper(buffer);
@ -511,8 +515,8 @@ static BOOL DEBUG_HandleDebugEvent(DEBUG_EVENT* de, LPDWORD cont)
break; break;
case UNLOAD_DLL_DEBUG_EVENT: case UNLOAD_DLL_DEBUG_EVENT:
DEBUG_Printf(DBG_CHN_TRACE, "%08lx:%08lx: unload DLL @%p\n", de->dwProcessId, de->dwThreadId, DEBUG_Printf(DBG_CHN_TRACE, "%08lx:%08lx: unload DLL @%08lx\n", de->dwProcessId, de->dwThreadId,
de->u.UnloadDll.lpBaseOfDll); (unsigned long)de->u.UnloadDll.lpBaseOfDll);
break; break;
case OUTPUT_DEBUG_STRING_EVENT: case OUTPUT_DEBUG_STRING_EVENT:
@ -614,6 +618,24 @@ int DEBUG_main(int argc, char** argv)
pid = 0; pid = 0;
} }
} }
if (argc == 1) {
LPSTR org, ptr;
DEBUG_Printf(DBG_CHN_MESG, "\n");
DEBUG_WalkProcess();
pid = strtol(org = readline("Enter pid to debug: "), &ptr, 0);
if (pid && ptr && ptr != org && *ptr == '\0') {
if (!(DEBUG_CurrProcess = DEBUG_AddProcess(pid, 0))) goto leave;
if (!DebugActiveProcess(pid)) {
DEBUG_Printf(DBG_CHN_ERR, "Can't attach process %ld: %ld\n",
pid, GetLastError());
goto leave;
}
} else {
pid = 0;
}
}
if (pid == 0) { if (pid == 0) {
PROCESS_INFORMATION info; PROCESS_INFORMATION info;