winedbg: Fix 'break file : lineno' command so that file can be in other modules than the current one.
This commit is contained in:
parent
2d570921dc
commit
cf7120b8cc
|
@ -270,6 +270,7 @@ void break_add_break_from_id(const char *name, int lineno, BOOL swbp)
|
||||||
|
|
||||||
struct cb_break_lineno
|
struct cb_break_lineno
|
||||||
{
|
{
|
||||||
|
const char* filename;
|
||||||
int lineno;
|
int lineno;
|
||||||
ADDRESS64 addr;
|
ADDRESS64 addr;
|
||||||
};
|
};
|
||||||
|
@ -287,6 +288,17 @@ static BOOL CALLBACK line_cb(SRCCODEINFO* sci, void* user)
|
||||||
return TRUE;
|
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
|
* 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)
|
void break_add_break_from_lineno(const char *filename, int lineno, BOOL swbp)
|
||||||
{
|
{
|
||||||
struct cb_break_lineno bkln;
|
struct cb_break_lineno bkln;
|
||||||
|
bkln.addr.Offset = 0;
|
||||||
|
bkln.lineno = lineno;
|
||||||
|
|
||||||
memory_get_current_pc(&bkln.addr);
|
if (!filename)
|
||||||
|
|
||||||
if (lineno != -1)
|
|
||||||
{
|
{
|
||||||
|
DWORD disp;
|
||||||
|
ADDRESS64 curr;
|
||||||
IMAGEHLP_LINE64 il;
|
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;
|
dbg_printf("Unable to add breakpoint (unknown address %lx)\n", linear);
|
||||||
|
|
||||||
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");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
filename = il.FileName;
|
||||||
|
SymEnumLines(dbg_curr_process->handle, linear, NULL, filename, line_cb, &bkln);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
break_add_break(&bkln.addr, TRUE, swbp);
|
{
|
||||||
|
/* 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");
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
Loading…
Reference in New Issue