Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreutarass2010-06-29 22:12:51 +0000
committereutarass2010-06-29 22:12:51 +0000
commitf34790f31915ea9964e1d8af84478329a5a904f9 (patch)
treed2b828476e978641e1784d7e3f0e98af04e7b8c0 /services/linenumbers_win32.c
parent7e1541ac776d2771bb296b4cd968954b878deb12 (diff)
downloadorg.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.c13
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;
}

Back to the top