diff options
author | eutarass | 2008-06-04 20:57:08 +0000 |
---|---|---|
committer | eutarass | 2008-06-04 20:57:08 +0000 |
commit | d73a703057eb05b56bfe87e02a514bc337500d68 (patch) | |
tree | bc9914f074b4beb61b5d648d68af383a91abf430 /linenumbers_win32.c | |
parent | 4e2bf205e7fd17ff43199df7ee20369ce69a0a10 (diff) | |
download | org.eclipse.tcf.agent-d73a703057eb05b56bfe87e02a514bc337500d68.tar.gz org.eclipse.tcf.agent-d73a703057eb05b56bfe87e02a514bc337500d68.tar.xz org.eclipse.tcf.agent-d73a703057eb05b56bfe87e02a514bc337500d68.zip |
1. Source line breakpoints are implemented.
2. TCF agent bug fixed: hash functions could return negative number causing memory corruption.
3. TCF agent: switched to latest version of dbghelp.dll - Windows XP comes with broken version of the DLL.
4. TCF agent: fixed a bug in DWARF line number information reader.
Diffstat (limited to 'linenumbers_win32.c')
-rw-r--r-- | linenumbers_win32.c | 78 |
1 files changed, 72 insertions, 6 deletions
diff --git a/linenumbers_win32.c b/linenumbers_win32.c index 82454b77..ebbbec45 100644 --- a/linenumbers_win32.c +++ b/linenumbers_win32.c @@ -34,9 +34,69 @@ static const char * LINENUMBERS = "LineNumbers"; +typedef struct LineToAddressArgs { + Context * ctx; + char * file; + int line; + line_to_address_callback callback; + void * user_args; + int error; +} LineToAddressArgs; + +static BOOL CALLBACK line_to_address_iterator(PSTR module_name, DWORD base_address, PVOID x) { + DWORD offset = 0; + IMAGEHLP_LINE line; + LineToAddressArgs * args = (LineToAddressArgs *)x; + + memset(&line, 0, sizeof(line)); + line.SizeOfStruct = sizeof(IMAGEHLP_LINE); + + if (args->error == 0 && !SymGetLineFromName(args->ctx->handle, module_name, args->file, args->line, &offset, &line)) { + set_win32_errno(GetLastError()); + args->error = errno; + } + if (args->error == 0) { + args->callback(args->user_args, line.Address); + } + return args->error == 0; +} + +int line_to_address(Context * ctx, char * file, int line, int column, line_to_address_callback callback, void * user_args) { + int err = 0; + + if (ctx == NULL) err = ERR_INV_CONTEXT; + else if (ctx->exited) err = ERR_ALREADY_EXITED; + + if (err == 0 && ctx->parent != NULL) ctx = ctx->parent; + if (err == 0 && set_symbol_context(ctx) != 0) err = errno; + + if (err == 0) { + LineToAddressArgs args; + args.ctx = ctx; + args.file = file; + args.line = line; + args.callback = callback; + args.user_args = user_args; + args.error = 0; + if (!SymEnumerateModules(ctx->handle, line_to_address_iterator, &args)) { + set_win32_errno(GetLastError()); + err = errno; + } + else { + err = args.error; + } + } + + if (err != 0) { + errno = err; + return -1; + } + return 0; +} + static void command_map_to_source(char * token, Channel * c) { int err = 0; - char * err_msg = NULL; + int not_found = 0; char id[256]; unsigned long addr0; unsigned long addr1; @@ -64,19 +124,25 @@ static void command_map_to_source(char * token, Channel * c) { line.SizeOfStruct = sizeof(IMAGEHLP_LINE); if (err == 0 && !SymGetLineFromAddr(ctx->handle, addr0, &offset, &line)) { - set_win32_errno(GetLastError()); - err = errno; + DWORD w = GetLastError(); + if (w == ERROR_MOD_NOT_FOUND) { + not_found = 1; + } + else { + set_win32_errno(w); + err = errno; + } } memcpy(&next, &line, sizeof(next)); - if (err == 0 && !SymGetLineNext(ctx->handle, &next)) { + if (err == 0 && !not_found && !SymGetLineNext(ctx->handle, &next)) { set_win32_errno(GetLastError()); err = errno; } write_stringz(&c->out, "R"); write_stringz(&c->out, token); - write_err_msg(&c->out, err, err_msg); - if (err != 0) { + write_errno(&c->out, err); + if (err != 0 || not_found) { write_stringz(&c->out, "null"); } else { |