- fixed regression in watchpoint setting (by addr)
authorEric Pouech <pouech-eric@wanadoo.fr>
Mon, 8 Nov 2004 20:25:55 +0000 (20:25 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 8 Nov 2004 20:25:55 +0000 (20:25 +0000)
- in backtrace, show at least module when no symbol is found
- protect event parsing from command line (when no real number)

programs/winedbg/break.c
programs/winedbg/dbg.y
programs/winedbg/debugger.h
programs/winedbg/memory.c
programs/winedbg/winedbg.c

index b987f13069805bf1d226ee05a2357b5ade35f402..1999c38fe6f33f3104246a9710b9ddd7d6f237ca 100644 (file)
@@ -351,7 +351,7 @@ void break_check_delayed_bp(void)
  *
  * Add a watchpoint.
  */
-void break_add_watch(const struct dbg_lvalue* lvalue, BOOL is_write)
+static void break_add_watch(const struct dbg_lvalue* lvalue, BOOL is_write)
 {
     int                num;
     DWORD      l = 4;
@@ -387,10 +387,26 @@ void break_add_watch(const struct dbg_lvalue* lvalue, BOOL is_write)
     dbg_printf("\n");
 }
 
+/******************************************************************
+ *             break_add_watch_from_lvalue
+ *
+ * Adds a watch point from an address (stored in a lvalue)
+ */
+void break_add_watch_from_lvalue(const struct dbg_lvalue* lvalue)
+{
+    struct dbg_lvalue   lval;
+
+    lval.addr.Mode = AddrModeFlat;
+    lval.addr.Offset = types_extract_as_integer(lvalue);
+    lval.type.id = dbg_itype_none;
+
+    break_add_watch(&lval, TRUE);
+}
+
 /***********************************************************************
  *           break_add_watch_from_id
  *
- * Add a watchpoint from a symbol name (and eventually a line #)
+ * Add a watchpoint from a symbol name
  */
 void   break_add_watch_from_id(const char *name)
 {
index 42ae53226618fb15bbb7fb93a31d72e7f5390a44..b7f2b5c13aee906cd6b2a1fc8c5527fd41ad6c95 100644 (file)
@@ -226,7 +226,7 @@ break_command:
     ;
 
 watch_command:
-      tWATCH '*' expr_lvalue    { break_add_watch(&$3, 1); }
+      tWATCH '*' expr_lvalue    { break_add_watch_from_lvalue(&$3); }
     | tWATCH identifier         { break_add_watch_from_id($2); }
     ;
 
index 2521bc0fb441d1e3db7d89007e57c7de285c4bd1..0b9f9e9c4cb516803bf3e71259647a9fcf08c6ca 100644 (file)
@@ -244,7 +244,7 @@ extern BOOL             break_add_break(const ADDRESS* addr, BOOL verbose);
 extern BOOL             break_add_break_from_lvalue(const struct dbg_lvalue* value);
 extern void             break_add_break_from_id(const char* name, int lineno);
 extern void             break_add_break_from_lineno(int lineno);
-extern void             break_add_watch(const struct dbg_lvalue* lvalue, int is_write);
+extern void             break_add_watch_from_lvalue(const struct dbg_lvalue* lvalue);
 extern void             break_add_watch_from_id(const char* name);
 extern void             break_check_delayed_bp(void);
 extern void             break_delete_xpoint(int num);
index 699e2ef728ed87c03c79ae5983c16c9f85cb8af8..0537726ef354cf631ca3d1db46fe250e5dc890ff 100644 (file)
@@ -542,40 +542,43 @@ void print_addr_and_args(const ADDRESS* pc, const ADDRESS* frame)
     IMAGEHLP_STACK_FRAME        isf;
     IMAGEHLP_LINE               il;
     IMAGEHLP_MODULE             im;
-    struct sym_enum             se;
-    char                        tmp[1024];
     DWORD64                     disp;
 
-    if (pc->Mode != AddrModeFlat) 
-        dbg_printf("0x%04x:0x%04lx", pc->Segment, pc->Offset);
-    else
-        dbg_printf("0x%08lx", pc->Offset);
+    print_bare_address(pc);
 
     isf.InstructionOffset = (DWORD_PTR)memory_to_linear_addr(pc);
     isf.FrameOffset       = (DWORD_PTR)memory_to_linear_addr(frame);
 
+    /* grab module where symbol is. If we don't have a module, we cannot print more */
+    im.SizeOfStruct = sizeof(im);
+    if (!SymGetModuleInfo(dbg_curr_process->handle, isf.InstructionOffset, &im))
+        return;
+
     si->SizeOfStruct = sizeof(*si);
     si->MaxNameLen   = 256;
-    if (!SymFromAddr(dbg_curr_process->handle, isf.InstructionOffset, &disp, si))
-        return;
+    if (SymFromAddr(dbg_curr_process->handle, isf.InstructionOffset, &disp, si))
+    {
+        struct sym_enum se;
+        char            tmp[1024];
 
-    dbg_printf(" %s", si->Name);
-    if (disp) dbg_printf("+0x%lx", (DWORD_PTR)disp);
+        dbg_printf(" %s", si->Name);
+        if (disp) dbg_printf("+0x%lx", (DWORD_PTR)disp);
 
-    SymSetContext(dbg_curr_process->handle, &isf, NULL);
-    se.tmp = tmp;
-    se.frame = isf.FrameOffset;
-    tmp[0] = '\0';
-    SymEnumSymbols(dbg_curr_process->handle, 0, NULL, sym_enum_cb, &se);
-    if (tmp[0]) dbg_printf("(%s)", tmp);
-
-    il.SizeOfStruct = sizeof(il);
-    if (SymGetLineFromAddr(dbg_curr_process->handle, isf.InstructionOffset,
-                           NULL, &il))
-        dbg_printf(" [%s:%lu]", il.FileName, il.LineNumber);
-    im.SizeOfStruct = sizeof(im);
-    if (SymGetModuleInfo(dbg_curr_process->handle, isf.InstructionOffset, &im))
+        SymSetContext(dbg_curr_process->handle, &isf, NULL);
+        se.tmp = tmp;
+        se.frame = isf.FrameOffset;
+        tmp[0] = '\0';
+        SymEnumSymbols(dbg_curr_process->handle, 0, NULL, sym_enum_cb, &se);
+        if (tmp[0]) dbg_printf("(%s)", tmp);
+
+        il.SizeOfStruct = sizeof(il);
+        if (SymGetLineFromAddr(dbg_curr_process->handle, isf.InstructionOffset,
+                               NULL, &il))
+            dbg_printf(" [%s:%lu]", il.FileName, il.LineNumber);
         dbg_printf(" in %s", im.ModuleName);
+    }
+    else dbg_printf(" in %s (+0x%lx)", 
+                    im.ModuleName, (DWORD_PTR)(isf.InstructionOffset - im.BaseOfImage));
 }
 
 BOOL memory_disasm_one_insn(ADDRESS* addr)
index 3c3f34d6be0224fe18a1de07e7a394b05cb348a7..9c7d3c751799a60a431d23a2a0a920bd06f2e867 100644 (file)
@@ -1180,7 +1180,7 @@ int main(int argc, char** argv)
         char*   ptr;
 
         dbg_curr_pid = strtol(argv[1], &ptr, 10);
-        if (dbg_curr_pid == 0 || ptr == NULL ||
+        if (dbg_curr_pid == 0 || ptr != argv[1] + strlen(argv[1]) ||
             !dbg_attach_debuggee(dbg_curr_pid, dbg_action_mode != gdb_mode, FALSE))
             dbg_curr_pid = 0;
     }