Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreutarass2008-06-04 20:57:08 +0000
committereutarass2008-06-04 20:57:08 +0000
commitd73a703057eb05b56bfe87e02a514bc337500d68 (patch)
treebc9914f074b4beb61b5d648d68af383a91abf430 /linenumbers_win32.c
parent4e2bf205e7fd17ff43199df7ee20369ce69a0a10 (diff)
downloadorg.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.c78
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 {

Back to the top