winedbg: Support setting a breakpoint from a file name and line number.

This commit is contained in:
Alexandre Julliard 2011-02-28 14:04:20 +01:00
parent 04e9b16c5b
commit 35d5c07538
4 changed files with 21 additions and 18 deletions

View File

@ -292,7 +292,7 @@ static BOOL CALLBACK line_cb(SRCCODEINFO* sci, void* user)
* *
* Add a breakpoint from a line number in current file * Add a breakpoint from a line number in current file
*/ */
void break_add_break_from_lineno(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;
@ -301,20 +301,23 @@ void break_add_break_from_lineno(int lineno, BOOL swbp)
if (lineno != -1) if (lineno != -1)
{ {
IMAGEHLP_LINE64 il; IMAGEHLP_LINE64 il;
DWORD disp;
DWORD_PTR linear = (DWORD_PTR)memory_to_linear_addr(&bkln.addr); DWORD_PTR linear = (DWORD_PTR)memory_to_linear_addr(&bkln.addr);
if (!filename)
{
DWORD disp;
il.SizeOfStruct = sizeof(il); il.SizeOfStruct = sizeof(il);
if (!SymGetLineFromAddr64(dbg_curr_process->handle, linear, &disp, &il)) if (!SymGetLineFromAddr64(dbg_curr_process->handle, linear, &disp, &il))
{ {
dbg_printf("Unable to add breakpoint (unknown address %lx)\n", linear); dbg_printf("Unable to add breakpoint (unknown address %lx)\n", linear);
return; return;
} }
filename = il.FileName;
}
bkln.addr.Offset = 0; bkln.addr.Offset = 0;
bkln.lineno = lineno; bkln.lineno = lineno;
SymEnumLines(dbg_curr_process->handle, linear, NULL, il.FileName, line_cb, &bkln); SymEnumLines(dbg_curr_process->handle, linear, NULL, filename, line_cb, &bkln);
if (!bkln.addr.Offset) if (!bkln.addr.Offset)
{ {
dbg_printf("Unknown line number\n" dbg_printf("Unknown line number\n"

View File

@ -233,14 +233,14 @@ print_command:
break_command: break_command:
tBREAK '*' expr_lvalue { break_add_break_from_lvalue(&$3, TRUE); } tBREAK '*' expr_lvalue { break_add_break_from_lvalue(&$3, TRUE); }
| tBREAK identifier { break_add_break_from_id($2, -1, TRUE); } | tBREAK identifier { break_add_break_from_id($2, -1, TRUE); }
| tBREAK identifier ':' tNUM { break_add_break_from_id($2, $4, TRUE); } | tBREAK pathname ':' tNUM { break_add_break_from_lineno($2, $4, TRUE); }
| tBREAK tNUM { break_add_break_from_lineno($2, TRUE); } | tBREAK tNUM { break_add_break_from_lineno(NULL, $2, TRUE); }
| tBREAK { break_add_break_from_lineno(-1, TRUE); } | tBREAK { break_add_break_from_lineno(NULL, -1, TRUE); }
| tHBREAK '*' expr_lvalue { break_add_break_from_lvalue(&$3, FALSE); } | tHBREAK '*' expr_lvalue { break_add_break_from_lvalue(&$3, FALSE); }
| tHBREAK identifier { break_add_break_from_id($2, -1, FALSE); } | tHBREAK identifier { break_add_break_from_id($2, -1, FALSE); }
| tHBREAK identifier ':' tNUM { break_add_break_from_id($2, $4, FALSE); } | tHBREAK pathname ':' tNUM { break_add_break_from_lineno($2, $4, FALSE); }
| tHBREAK tNUM { break_add_break_from_lineno($2, FALSE); } | tHBREAK tNUM { break_add_break_from_lineno(NULL, $2, FALSE); }
| tHBREAK { break_add_break_from_lineno(-1, FALSE); } | tHBREAK { break_add_break_from_lineno(NULL, -1, FALSE); }
| tENABLE tNUM { break_enable_xpoint($2, TRUE); } | tENABLE tNUM { break_enable_xpoint($2, TRUE); }
| tENABLE tBREAK tNUM { break_enable_xpoint($3, TRUE); } | tENABLE tBREAK tNUM { break_enable_xpoint($3, TRUE); }
| tDISABLE tNUM { break_enable_xpoint($2, FALSE); } | tDISABLE tNUM { break_enable_xpoint($2, FALSE); }

View File

@ -200,8 +200,8 @@ STRING \"[^\n"]+\"
<INITIAL,NOPROCESS>source|sourc|sour|src { BEGIN(PATH_EXPECTED); return tSOURCE; } <INITIAL,NOPROCESS>source|sourc|sour|src { BEGIN(PATH_EXPECTED); return tSOURCE; }
<INITIAL>symbolfile|symbols|symbol|sf { BEGIN(PATH_EXPECTED); return tSYMBOLFILE; } <INITIAL>symbolfile|symbols|symbol|sf { BEGIN(PATH_EXPECTED); return tSYMBOLFILE; }
<INITIAL,INFO_CMD,BD_CMD>break|brea|bre|br|b { BEGIN(NOCMD); return tBREAK; } <INITIAL,INFO_CMD,BD_CMD>break|brea|bre|br|b { BEGIN(PATH_ACCEPTED); return tBREAK; }
<INITIAL,INFO_CMD,BD_CMD>hbreak|hbrea|hbre|hbr|hb { BEGIN(NOCMD); return tHBREAK; } <INITIAL,INFO_CMD,BD_CMD>hbreak|hbrea|hbre|hbr|hb { BEGIN(PATH_ACCEPTED); return tHBREAK; }
<INITIAL>watch|watc|wat { BEGIN(NOCMD); return tWATCH; } <INITIAL>watch|watc|wat { BEGIN(NOCMD); return tWATCH; }
<INITIAL>rwatch|rwatc|rwat { BEGIN(NOCMD); return tRWATCH; } <INITIAL>rwatch|rwatc|rwat { BEGIN(NOCMD); return tRWATCH; }
<INITIAL>whatis|whati|what { BEGIN(NOCMD); return tWHATIS; } <INITIAL>whatis|whati|what { BEGIN(NOCMD); return tWHATIS; }

View File

@ -293,7 +293,7 @@ extern void break_set_xpoints(BOOL set);
extern BOOL break_add_break(const ADDRESS64* addr, BOOL verbose, BOOL swbp); extern BOOL break_add_break(const ADDRESS64* addr, BOOL verbose, BOOL swbp);
extern BOOL break_add_break_from_lvalue(const struct dbg_lvalue* value, BOOL swbp); extern BOOL break_add_break_from_lvalue(const struct dbg_lvalue* value, BOOL swbp);
extern void break_add_break_from_id(const char* name, int lineno, BOOL swbp); extern void break_add_break_from_id(const char* name, int lineno, BOOL swbp);
extern void break_add_break_from_lineno(int lineno, BOOL swbp); extern void break_add_break_from_lineno(const char *filename, int lineno, BOOL swbp);
extern void break_add_watch_from_lvalue(const struct dbg_lvalue* lvalue, BOOL is_write); extern void break_add_watch_from_lvalue(const struct dbg_lvalue* lvalue, BOOL is_write);
extern void break_add_watch_from_id(const char* name, BOOL is_write); extern void break_add_watch_from_id(const char* name, BOOL is_write);
extern void break_check_delayed_bp(void); extern void break_check_delayed_bp(void);