internal void ChildExecd(SingleSteppingEngine engine, Inferior inferior)
{
is_execed = true;
if (!is_forked) {
if (mono_language != null)
mono_language.Dispose();
if (native_language != null)
native_language.Dispose ();
if (os != null)
os.Dispose ();
if (symtab_manager != null)
symtab_manager.Dispose ();
}
if (breakpoint_manager != null)
breakpoint_manager.Dispose ();
session.OnProcessExecd (this);
breakpoint_manager = new BreakpointManager ();
exception_handlers = new Dictionary<int,ExceptionCatchPoint> ();
symtab_manager = new SymbolTableManager (session);
os = Inferior.CreateOperatingSystemBackend (this);
native_language = new NativeLanguage (this, os, target_info);
Inferior new_inferior = Inferior.CreateInferior (manager, this, start);
try {
new_inferior.InitializeAfterExec (inferior.PID);
} catch (Exception ex) {
if ((ex is TargetException) && (((TargetException) ex).Type == TargetError.PermissionDenied)) {
Report.Error ("Permission denied when trying to debug exec()ed child {0}, detaching!",
inferior.PID);
} else {
Report.Error ("InitializeAfterExec() failed on pid {0}: {1}", inferior.PID, ex);
}
new_inferior.DetachAfterFork ();
return;
}
SingleSteppingEngine new_thread = new SingleSteppingEngine (
manager, this, new_inferior, inferior.PID);
ThreadServant[] threads;
lock (thread_hash.SyncRoot) {
threads = new ThreadServant [thread_hash.Count];
thread_hash.Values.CopyTo (threads, 0);
}
for (int i = 0; i < threads.Length; i++) {
if (threads [i].PID != inferior.PID)
threads [i].Kill ();
}
thread_hash [inferior.PID] = new_thread;
inferior.Dispose ();
inferior = null;
manager.Debugger.OnProcessExecdEvent (this);
manager.Debugger.OnThreadCreatedEvent (new_thread.Thread);
initialized = is_forked = false;
main_thread = new_thread;
if ((engine.Thread.ThreadFlags & Thread.Flags.StopOnExit) != 0)
new_thread.Thread.ThreadFlags |= Thread.Flags.StopOnExit;
CommandResult result = engine.OnExecd (new_thread);
new_thread.StartExecedChild (result);
}