winedbg: Use standard Wine lists for processes.
This commit is contained in:
parent
2becd3349d
commit
d9e42e87f2
|
@ -37,6 +37,7 @@
|
||||||
#include "cvconst.h"
|
#include "cvconst.h"
|
||||||
#include "objbase.h"
|
#include "objbase.h"
|
||||||
#include "oaidl.h"
|
#include "oaidl.h"
|
||||||
|
#include <wine/list.h>
|
||||||
|
|
||||||
#define ADDRSIZE (be_cpu->pointer_size)
|
#define ADDRSIZE (be_cpu->pointer_size)
|
||||||
#define ADDRWIDTH (ADDRSIZE * 2)
|
#define ADDRWIDTH (ADDRSIZE * 2)
|
||||||
|
@ -217,6 +218,7 @@ struct dbg_delayed_bp
|
||||||
#define MAX_BREAKPOINTS 100
|
#define MAX_BREAKPOINTS 100
|
||||||
struct dbg_process
|
struct dbg_process
|
||||||
{
|
{
|
||||||
|
struct list entry;
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
DWORD pid;
|
DWORD pid;
|
||||||
const struct be_process_io* process_io;
|
const struct be_process_io* process_io;
|
||||||
|
@ -234,8 +236,6 @@ struct dbg_process
|
||||||
char source_current_file[MAX_PATH];
|
char source_current_file[MAX_PATH];
|
||||||
int source_start_line;
|
int source_start_line;
|
||||||
int source_end_line;
|
int source_end_line;
|
||||||
struct dbg_process* next;
|
|
||||||
struct dbg_process* prev;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* describes the way the debugger interacts with a given process */
|
/* describes the way the debugger interacts with a given process */
|
||||||
|
|
|
@ -91,7 +91,7 @@ DWORD_PTR dbg_curr_pid = 0;
|
||||||
CONTEXT dbg_context;
|
CONTEXT dbg_context;
|
||||||
BOOL dbg_interactiveP = FALSE;
|
BOOL dbg_interactiveP = FALSE;
|
||||||
|
|
||||||
static struct dbg_process* dbg_process_list = NULL;
|
static struct list dbg_process_list = LIST_INIT(dbg_process_list);
|
||||||
|
|
||||||
struct dbg_internal_var dbg_internal_vars[DBG_IV_LAST];
|
struct dbg_internal_var dbg_internal_vars[DBG_IV_LAST];
|
||||||
static HANDLE dbg_houtput;
|
static HANDLE dbg_houtput;
|
||||||
|
@ -259,30 +259,25 @@ const struct dbg_internal_var* dbg_get_internal_var(const char* name)
|
||||||
|
|
||||||
unsigned dbg_num_processes(void)
|
unsigned dbg_num_processes(void)
|
||||||
{
|
{
|
||||||
struct dbg_process* p;
|
return list_count(&dbg_process_list);
|
||||||
unsigned num = 0;
|
|
||||||
|
|
||||||
for (p = dbg_process_list; p; p = p->next)
|
|
||||||
num++;
|
|
||||||
return num;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dbg_process* dbg_get_process(DWORD pid)
|
struct dbg_process* dbg_get_process(DWORD pid)
|
||||||
{
|
{
|
||||||
struct dbg_process* p;
|
struct dbg_process* p;
|
||||||
|
|
||||||
for (p = dbg_process_list; p; p = p->next)
|
LIST_FOR_EACH_ENTRY(p, &dbg_process_list, struct dbg_process, entry)
|
||||||
if (p->pid == pid) break;
|
if (p->pid == pid) return p;
|
||||||
return p;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dbg_process* dbg_get_process_h(HANDLE h)
|
struct dbg_process* dbg_get_process_h(HANDLE h)
|
||||||
{
|
{
|
||||||
struct dbg_process* p;
|
struct dbg_process* p;
|
||||||
|
|
||||||
for (p = dbg_process_list; p; p = p->next)
|
LIST_FOR_EACH_ENTRY(p, &dbg_process_list, struct dbg_process, entry)
|
||||||
if (p->handle == h) break;
|
if (p->handle == h) return p;
|
||||||
return p;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dbg_process* dbg_add_process(const struct be_process_io* pio, DWORD pid, HANDLE h)
|
struct dbg_process* dbg_add_process(const struct be_process_io* pio, DWORD pid, HANDLE h)
|
||||||
|
@ -323,10 +318,7 @@ struct dbg_process* dbg_add_process(const struct be_process_io* pio, DWORD pid,
|
||||||
p->source_start_line = -1;
|
p->source_start_line = -1;
|
||||||
p->source_end_line = -1;
|
p->source_end_line = -1;
|
||||||
|
|
||||||
p->next = dbg_process_list;
|
list_add_head(&dbg_process_list, &p->entry);
|
||||||
p->prev = NULL;
|
|
||||||
if (dbg_process_list) dbg_process_list->prev = p;
|
|
||||||
dbg_process_list = p;
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,9 +345,7 @@ void dbg_del_process(struct dbg_process* p)
|
||||||
HeapFree(GetProcessHeap(), 0, p->delayed_bp);
|
HeapFree(GetProcessHeap(), 0, p->delayed_bp);
|
||||||
source_nuke_path(p);
|
source_nuke_path(p);
|
||||||
source_free_files(p);
|
source_free_files(p);
|
||||||
if (p->prev) p->prev->next = p->next;
|
list_remove(&p->entry);
|
||||||
if (p->next) p->next->prev = p->prev;
|
|
||||||
if (p == dbg_process_list) dbg_process_list = p->next;
|
|
||||||
if (p == dbg_curr_process) dbg_curr_process = NULL;
|
if (p == dbg_curr_process) dbg_curr_process = NULL;
|
||||||
HeapFree(GetProcessHeap(), 0, (char*)p->imageName);
|
HeapFree(GetProcessHeap(), 0, (char*)p->imageName);
|
||||||
HeapFree(GetProcessHeap(), 0, p);
|
HeapFree(GetProcessHeap(), 0, p);
|
||||||
|
@ -541,14 +531,16 @@ void dbg_set_option(const char* option, const char* val)
|
||||||
|
|
||||||
BOOL dbg_interrupt_debuggee(void)
|
BOOL dbg_interrupt_debuggee(void)
|
||||||
{
|
{
|
||||||
if (!dbg_process_list) return FALSE;
|
struct dbg_process* p;
|
||||||
|
if (list_empty(&dbg_process_list)) return FALSE;
|
||||||
/* FIXME: since we likely have a single process, signal the first process
|
/* FIXME: since we likely have a single process, signal the first process
|
||||||
* in list
|
* in list
|
||||||
*/
|
*/
|
||||||
if (dbg_process_list->next) dbg_printf("Ctrl-C: only stopping the first process\n");
|
p = LIST_ENTRY(list_head(&dbg_process_list), struct dbg_process, entry);
|
||||||
|
if (list_next(&dbg_process_list, &p->entry)) dbg_printf("Ctrl-C: only stopping the first process\n");
|
||||||
else dbg_printf("Ctrl-C: stopping debuggee\n");
|
else dbg_printf("Ctrl-C: stopping debuggee\n");
|
||||||
dbg_process_list->continue_on_first_exception = FALSE;
|
p->continue_on_first_exception = FALSE;
|
||||||
return DebugBreakProcess(dbg_process_list->handle);
|
return DebugBreakProcess(p->handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL WINAPI ctrl_c_handler(DWORD dwCtrlType)
|
static BOOL WINAPI ctrl_c_handler(DWORD dwCtrlType)
|
||||||
|
@ -596,6 +588,9 @@ static int dbg_winedbg_usage(BOOL advanced)
|
||||||
|
|
||||||
void dbg_start_interactive(HANDLE hFile)
|
void dbg_start_interactive(HANDLE hFile)
|
||||||
{
|
{
|
||||||
|
struct dbg_process* p;
|
||||||
|
struct dbg_process* p2;
|
||||||
|
|
||||||
if (dbg_curr_process)
|
if (dbg_curr_process)
|
||||||
{
|
{
|
||||||
dbg_printf("WineDbg starting on pid %04lx\n", dbg_curr_pid);
|
dbg_printf("WineDbg starting on pid %04lx\n", dbg_curr_pid);
|
||||||
|
@ -605,8 +600,8 @@ void dbg_start_interactive(HANDLE hFile)
|
||||||
dbg_interactiveP = TRUE;
|
dbg_interactiveP = TRUE;
|
||||||
parser_handle(hFile);
|
parser_handle(hFile);
|
||||||
|
|
||||||
while (dbg_process_list)
|
LIST_FOR_EACH_ENTRY_SAFE(p, p2, &dbg_process_list, struct dbg_process, entry)
|
||||||
dbg_process_list->process_io->close_process(dbg_process_list, FALSE);
|
p->process_io->close_process(p, FALSE);
|
||||||
|
|
||||||
dbg_save_internal_vars();
|
dbg_save_internal_vars();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue