diff options
author | eutarass | 2010-06-29 22:12:51 +0000 |
---|---|---|
committer | eutarass | 2010-06-29 22:12:51 +0000 |
commit | f34790f31915ea9964e1d8af84478329a5a904f9 (patch) | |
tree | d2b828476e978641e1784d7e3f0e98af04e7b8c0 /services/linenumbers_win32.c | |
parent | 7e1541ac776d2771bb296b4cd968954b878deb12 (diff) | |
download | org.eclipse.tcf.agent-f34790f31915ea9964e1d8af84478329a5a904f9.tar.gz org.eclipse.tcf.agent-f34790f31915ea9964e1d8af84478329a5a904f9.tar.xz org.eclipse.tcf.agent-f34790f31915ea9964e1d8af84478329a5a904f9.zip |
TCF Agent: fixed: line numbers service on Windows address_to_line() return wrong address of a text area if requested address is in jump table
Diffstat (limited to 'services/linenumbers_win32.c')
-rw-r--r-- | services/linenumbers_win32.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/services/linenumbers_win32.c b/services/linenumbers_win32.c index 60a5c8ea..1a717615 100644 --- a/services/linenumbers_win32.c +++ b/services/linenumbers_win32.c @@ -90,6 +90,8 @@ int address_to_line(Context * ctx, ContextAddress addr0, ContextAddress addr1, L DWORD offset = 0; IMAGEHLP_LINE line; IMAGEHLP_LINE next; + ContextAddress org_addr0 = addr0; + ContextAddress org_addr1 = addr1; if (ctx == NULL) err = ERR_INV_CONTEXT; else if (ctx->exited) err = ERR_ALREADY_EXITED; @@ -117,6 +119,7 @@ int address_to_line(Context * ctx, ContextAddress addr0, ContextAddress addr1, L signed char disp08; if (context_read_mem(ctx, addr0 + 1, &disp08, 1) == 0) { dest = addr0 + 2 + disp08; + org_addr1 = addr0 + 2; } } else if (instr == JMPD32) { @@ -124,6 +127,7 @@ int address_to_line(Context * ctx, ContextAddress addr0, ContextAddress addr1, L assert(sizeof(disp32) == 4); if (context_read_mem(ctx, addr0 + 1, &disp32, 4) == 0) { dest = addr0 + 5 + disp32; + org_addr1 = addr0 + 5; } } else if (instr == GRP5) { @@ -131,6 +135,7 @@ int address_to_line(Context * ctx, ContextAddress addr0, ContextAddress addr1, L ContextAddress ptr = 0; if (context_read_mem(ctx, addr0 + 2, &ptr, 4) == 0) { context_read_mem(ctx, ptr, &dest, 4); + org_addr1 = addr0 + 6; } } } @@ -153,16 +158,20 @@ int address_to_line(Context * ctx, ContextAddress addr0, ContextAddress addr1, L } if (err == 0 && !not_found) { - for (;;) { + while (line.Address < next.Address && line.Address < addr1 && next.Address > addr0) { CodeArea area; + memset(&area, 0, sizeof(area)); area.file = line.FileName; area.start_address = line.Address; area.start_line = line.LineNumber; area.end_address = next.Address; area.end_line = next.LineNumber; + if (org_addr0 != addr0) { + area.start_address = org_addr0; + area.end_address = org_addr1; + } callback(&area, user_args); - if (next.Address >= addr1) break; memcpy(&line, &next, sizeof(line)); if (!SymGetLineNext(get_context_handle(ctx), &next)) break; } |