/// <summary> /// An event handler called when a condition that might require a dump is detected. /// This is invoked in the UI thread. /// </summary> /// <param name="description">String description of the origin of the failure (RIP, Assert, or Exception)</param> /// <param name="eventInfo">EventInfo associated with this failure</param> public void OnTitleFailureInUIThread(string description, IXboxEventInfo eventInfo) { bool createDump = this.DumpMode == DumpModeEnum.Auto; if (this.DumpMode == DumpModeEnum.Prompt) { MessageBoxResult result = MessageBox.Show("Detected " + description + " on " + this.XboxViewItem.XboxDevice.Name + ". Generate dump file?", "Detected: " + description, MessageBoxButton.YesNo, MessageBoxImage.Question); createDump = result == MessageBoxResult.Yes; } if (createDump) { string fileName = "Dump" + this.dumpIndex + ".dmp"; this.dumpIndex++; Mouse.OverrideCursor = Cursors.Wait; this.XboxViewItem.XboxDevice.SaveDump(Path.Combine(this.logDirectory, fileName), this.DumpFullHeap); Mouse.OverrideCursor = null; if (this.DumpMode == DumpModeEnum.Prompt) { Process.Start(this.logDirectory); } } this.XboxViewItem.XboxDevice.ContinueExecution(eventInfo); }
private static void con_OnStdNotify(XboxDebugEventType EventCode, IXboxEventInfo EventInfo) { if (EventCode == XboxDebugEventType.ModuleLoad && breakOnModuleLoad) { Pause(); } if (EventCode == XboxDebugEventType.ThreadCreate && breakOnThreadCreate) { Pause(); } Log.Write("Event: " + EventCode.ToString() + " "); switch (EventCode) { case XboxDebugEventType.ExecutionBreak: if (recordTrace) { int n = GetThreadIndexById(EventInfo.Info.Thread.ThreadId); Tracer.AppendLog(EventInfo.Info.Address, GetThreadRegisters32(n), GetThreadRegisters64(n)); } breakThreadId = EventInfo.Info.Thread.ThreadId; refreshCPU = true; isRunning = false; break; case XboxDebugEventType.ExecStateChange: Log.WriteLine(EventInfo.Info.ExecState.ToString()); isRunning = EventInfo.Info.ExecState != XboxExecutionState.Stopped; refreshExecState = true; break; case XboxDebugEventType.ThreadCreate: XBOX_THREAD_INFO t = EventInfo.Info.Thread.ThreadInfo; Log.WriteLine("TID=" + t.ThreadId.ToString("X8") + " StartAddress=0x" + t.StartAddress.ToString("X8")); refreshThreads = true; break; case XboxDebugEventType.ThreadDestroy: Log.WriteLine("TID=" + EventInfo.Info.Thread.ThreadId.ToString("X8")); refreshThreads = true; break; case XboxDebugEventType.ModuleLoad: XBOX_MODULE_INFO m = EventInfo.Info.Module.ModuleInfo; Log.WriteLine("Name=\"" + m.FullName + "\" BaseAddress=0x" + m.BaseAddress.ToString("X8")); break; case XboxDebugEventType.ModuleUnload: XBOX_MODULE_INFO m2 = EventInfo.Info.Module.ModuleInfo; Log.WriteLine("Name=\"" + m2.FullName + "\""); break; case XboxDebugEventType.DebugString: Log.WriteLine(EventInfo.Info.Message.Replace("\n", "\\n")); break; default: Log.WriteLine(""); break; } }
public virtual void OnStdNotify(XboxDebugEventType _param1, IXboxEventInfo _param2) { if (this.m_OnStdNotifyDelegate == null) { return; } this.m_OnStdNotifyDelegate(_param1, _param2); }
/// <summary> /// An event handler called when a condition that might require a dump is detected. /// This is NOT invoked in the UI thread. /// </summary> /// <param name="description">String description of the origin of the failure (RIP, Assert, or Exception)</param> /// <param name="eventInfo">EventInfo associated with this failure</param> public void OnTitleFailure(string description, IXboxEventInfo eventInfo) { try { Dispatcher dispatcher = this.debugOutputWindow.Dispatcher; if (dispatcher != null) { dispatcher.BeginInvoke(new Action(() => { this.OnTitleFailureInUIThread(description, eventInfo); })); } } catch (TaskCanceledException) { // Don't complain about late arrival if UI has already gone away } }
private static void con_OnStdNotify(XboxDebugEventType EventCode, IXboxEventInfo EventInfo) { XBOX_THREAD_INFO t; XBOX_MODULE_INFO m; if (EventCode == XboxDebugEventType.ModuleLoad && breakOnModuleLoad) { Pause(); } if (EventCode == XboxDebugEventType.ThreadCreate && breakOnThreadCreate) { Pause(); } Log.Write("Event: " + EventCode.ToString() + " "); switch (EventCode) { case XboxDebugEventType.Exception: jtag.DebugTarget.FreeEventInfo(EventInfo.Info); if (EventInfo.Info.Message != null) { Log.WriteLine("Exception @0x" + EventInfo.Info.Address.ToString("X8") + " \"" + EventInfo.Info.Message + "\""); } else { Log.WriteLine("Exception @0x" + EventInfo.Info.Address.ToString("X8")); } breakThreadId = EventInfo.Info.Thread.ThreadId; refreshCPU = true; isRunning = false; break; case XboxDebugEventType.ExecutionBreak: if (recordTrace) { int n = GetThreadIndexById(EventInfo.Info.Thread.ThreadId); Tracer.AppendLog(EventInfo.Info.Address, GetThreadRegisters32(n), GetThreadRegisters64(n)); } breakThreadId = EventInfo.Info.Thread.ThreadId; refreshCPU = true; isRunning = false; break; case XboxDebugEventType.ExecStateChange: Log.WriteLine(EventInfo.Info.ExecState.ToString()); isRunning = EventInfo.Info.ExecState != XboxExecutionState.Stopped && EventInfo.Info.ExecState != XboxExecutionState.PendingTitle; refreshExecState = true; break; case XboxDebugEventType.ThreadCreate: t = EventInfo.Info.Thread.ThreadInfo; Log.WriteLine("TID=" + t.ThreadId.ToString("X8") + " StartAddress=0x" + t.StartAddress.ToString("X8")); //refreshThreads = true; break; case XboxDebugEventType.ThreadDestroy: Log.WriteLine("TID=" + EventInfo.Info.Thread.ThreadId.ToString("X8")); //refreshThreads = true; break; case XboxDebugEventType.ModuleLoad: m = EventInfo.Info.Module.ModuleInfo; Log.WriteLine("Name=\"" + m.FullName + "\" BaseAddress=0x" + m.BaseAddress.ToString("X8")); break; case XboxDebugEventType.ModuleUnload: m = EventInfo.Info.Module.ModuleInfo; Log.WriteLine("Name=\"" + m.FullName + "\""); break; case XboxDebugEventType.DebugString: Log.WriteLine(""); StringReader sr = new StringReader(EventInfo.Info.Message); string line; while ((line = sr.ReadLine()) != null && line.Trim() != "") { Log.WriteLine("\t" + line); } break; default: Log.WriteLine(""); break; } }