Eric Pouech : winedbg: Fix 'break file : lineno' command so that file can be in other modules than the current one.
Alexandre Julliard
julliard at winehq.org
Tue Mar 8 11:03:51 CST 2011
Module: wine
Branch: master
Commit: cf7120b8cce712bdd450d19585427633b7033544
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf7120b8cce712bdd450d19585427633b7033544
Author: Eric Pouech <eric.pouech at orange.fr>
Date: Mon Mar 7 22:41:09 2011 +0100
winedbg: Fix 'break file : lineno' command so that file can be in other modules than the current one.
---
programs/winedbg/break.c | 60 +++++++++++++++++++++++++++------------------
1 files changed, 36 insertions(+), 24 deletions(-)
diff --git a/programs/winedbg/break.c b/programs/winedbg/break.c
index debc0c7..e156a40 100644
--- a/programs/winedbg/break.c
+++ b/programs/winedbg/break.c
@@ -270,6 +270,7 @@ void break_add_break_from_id(const char *name, int lineno, BOOL swbp)
struct cb_break_lineno
{
+ const char* filename;
int lineno;
ADDRESS64 addr;
};
@@ -287,6 +288,17 @@ static BOOL CALLBACK line_cb(SRCCODEINFO* sci, void* user)
return TRUE;
}
+static BOOL CALLBACK mcb(PCWSTR module, DWORD64 base, void* user)
+{
+ struct cb_break_lineno* bkln = user;
+
+ SymEnumLines(dbg_curr_process->handle, base, NULL, bkln->filename, line_cb, bkln);
+ /* continue module enum if no addr found
+ * FIXME: we don't report when several addresses match the same filename/lineno pair
+ */
+ return !bkln->addr.Offset;
+}
+
/***********************************************************************
* break_add_break_from_lineno
*
@@ -295,38 +307,38 @@ static BOOL CALLBACK line_cb(SRCCODEINFO* sci, void* user)
void break_add_break_from_lineno(const char *filename, int lineno, BOOL swbp)
{
struct cb_break_lineno bkln;
+ bkln.addr.Offset = 0;
+ bkln.lineno = lineno;
- memory_get_current_pc(&bkln.addr);
-
- if (lineno != -1)
+ if (!filename)
{
+ DWORD disp;
+ ADDRESS64 curr;
IMAGEHLP_LINE64 il;
- DWORD_PTR linear = (DWORD_PTR)memory_to_linear_addr(&bkln.addr);
+ DWORD_PTR linear;
- if (!filename)
+ memory_get_current_pc(&curr);
+ linear = (DWORD_PTR)memory_to_linear_addr(&curr);
+ il.SizeOfStruct = sizeof(il);
+ if (!SymGetLineFromAddr64(dbg_curr_process->handle, linear, &disp, &il))
{
- DWORD disp;
-
- il.SizeOfStruct = sizeof(il);
- if (!SymGetLineFromAddr64(dbg_curr_process->handle, linear, &disp, &il))
- {
- dbg_printf("Unable to add breakpoint (unknown address %lx)\n", linear);
- return;
- }
- filename = il.FileName;
- }
- bkln.addr.Offset = 0;
- bkln.lineno = lineno;
- SymEnumLines(dbg_curr_process->handle, linear, NULL, filename, line_cb, &bkln);
- if (!bkln.addr.Offset)
- {
- dbg_printf("Unknown line number\n"
- "(either out of file, or no code at given line number)\n");
+ dbg_printf("Unable to add breakpoint (unknown address %lx)\n", linear);
return;
}
+ filename = il.FileName;
+ SymEnumLines(dbg_curr_process->handle, linear, NULL, filename, line_cb, &bkln);
}
-
- break_add_break(&bkln.addr, TRUE, swbp);
+ else
+ {
+ /* we have to enumerate across modules */
+ bkln.filename = filename;
+ SymEnumerateModulesW64(dbg_curr_process->handle, mcb, &bkln);
+ }
+ if (bkln.addr.Offset)
+ break_add_break(&bkln.addr, TRUE, swbp);
+ else
+ dbg_printf("Unknown line number\n"
+ "(either out of file, or no code at given line number)\n");
}
/***********************************************************************
More information about the wine-cvs
mailing list