From: Rejean Loyer Date: Mon, 4 Mar 2013 23:22:56 +0000 (-0500) Subject: ide;debugger; added internalModuleLoad breakpoint (using InternalModuleLoadBreakpoint... X-Git-Tag: 0.44.04~61 X-Git-Url: http://ecere.com/cgi-bin/gitweb.cgi?p=sdk;a=commitdiff_plain;h=d7ccb5829e302f1b72ee42dc11d8143e2876aadd ide;debugger; added internalModuleLoad breakpoint (using InternalModuleLoadBreakpoint function in instance.c) for Module_Load calls occuring after the internalModulesLoaded breakpoint is hit. --- diff --git a/ecere/src/com/instance.c b/ecere/src/com/instance.c index ddcf947..9374e91 100644 --- a/ecere/src/com/instance.c +++ b/ecere/src/com/instance.c @@ -394,3 +394,9 @@ void Instance_Module_Free(void * library) dlclose(library); #endif } + +#if defined(_DEBUG) + void InternalModuleLoadBreakpoint() + { + } +#endif diff --git a/ecere/src/com/instance.ec b/ecere/src/com/instance.ec index 8fa1a9c..a1d2ca7 100644 --- a/ecere/src/com/instance.ec +++ b/ecere/src/com/instance.ec @@ -89,6 +89,9 @@ bool Instance_LocateModule(char * name, char * fileName); void Instance_COM_Initialize(int argc, char ** argv, char ** parsedCommand, int * argcPtr, char *** argvPtr); void * Instance_Module_Load(const char * libLocation, const char * name, void ** Load, void ** Unload); void Instance_Module_Free(void * library); +#if defined(_DEBUG) +void InternalModuleLoadBreakpoint(); +#endif private: @@ -5207,6 +5210,9 @@ static Module Module_Load(Module fromModule, char * name, AccessMode importAcces } incref module; } +#if defined(_DEBUG) + InternalModuleLoadBreakpoint(); +#endif return module; } diff --git a/ide/src/debugger/Debugger.ec b/ide/src/debugger/Debugger.ec index 32f8d0c..841ee08 100644 --- a/ide/src/debugger/Debugger.ec +++ b/ide/src/debugger/Debugger.ec @@ -305,7 +305,7 @@ char progFifoDir[MAX_LOCATION]; enum DebuggerState { none, prompt, loaded, running, stopped, terminated }; enum DebuggerEvent { none, hit, breakEvent, signal, stepEnd, functionEnd, exit }; enum DebuggerAction { none, internal, restart, stop, selectFrame }; //, bpValidation -enum BreakpointType { none, internalMain, internalWinMain, internalModulesLoaded, user, runToCursor }; +enum BreakpointType { none, internalMain, internalWinMain, internalModulesLoaded, user, runToCursor, internalModuleLoad }; enum DebuggerEvaluationError { none, symbolNotFound, memoryCantBeRead, unknown }; FileDialog debuggerFileDialog { type = selectDir }; @@ -456,7 +456,8 @@ class Debugger bpHit = bp; if(!(!userBreakOnInternBreak && - bp && (bp.type == internalMain || bp.type == internalWinMain || bp.type == internalModulesLoaded))) + bp && (bp.type == internalMain || bp.type == internalWinMain || + bp.type == internalModulesLoaded || bp.type == internalModuleLoad))) monitor = true; hitThread = stopItem.threadid; } @@ -607,7 +608,7 @@ class Debugger sysBPs.Add(Breakpoint { type = internalWinMain, enabled = true, level = -1 }); #endif sysBPs.Add(Breakpoint { type = internalModulesLoaded, enabled = true, level = -1 }); - + sysBPs.Add(Breakpoint { type = internalModuleLoad, enabled = true, level = -1 }); } ~Debugger() @@ -1551,11 +1552,40 @@ class Debugger bp.bp = bpItem; bpItem = null; bp.inserted = (bp.bp && bp.bp.number != 0); - ValidateBreakpoint(bp); } delete f; } - break; + } + else if(bp.type == internalModuleLoad && modules) + { + Project ecerePrj = null; + for(p : ide.workspace.projects) + { + if(!strcmp(p.topNode.name, "ecere.epj")) + { + ecerePrj = p; + break; + } + } + if(ecerePrj) + { + ProjectNode node = ecerePrj.topNode.Find("instance.c", false); + if(node) + { + char path[MAX_LOCATION]; + char relative[MAX_LOCATION]; + node.GetFullFilePath(path); + bp.absoluteFilePath = CopyString(path); + MakePathRelative(path, ecerePrj.topNode.path, relative); + delete bp.relativeFilePath; + bp.relativeFilePath = CopyString(relative); + sentBreakInsert = true; + GdbCommand(false, "-break-insert %s:InternalModuleLoadBreakpoint", bp.relativeFilePath); + bp.bp = bpItem; + bpItem = null; + bp.inserted = (bp.bp && bp.bp.number != 0); + } + } } } } @@ -2641,6 +2671,11 @@ class Debugger break; case internalModulesLoaded: modules = true; + GdbInsertInternalBreakpoint(); + GdbBreakpointsInsert(); + GdbExecContinue(false); + break; + case internalModuleLoad: GdbBreakpointsInsert(); GdbExecContinue(false); break;