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