private void StepGdbButton_Click(object sender, EventArgs e) { if (Gdb.Running) { return; } Gdb.Step(); OnUpdateControls(); OnUpdate(); PdbLineNumber line = PdbSession.FindLinesByVirtualAddress(Gdb.Registers.Eip, 1).FirstOrDefault(); if (line == null) { return; } PdbSourceFile sourceFile = line.SourceFile; if (sourceFile == null) { return; } EnvDTE.Window window = VisualStudio.Instance.ItemOperations.OpenFile(sourceFile.FileName); EnvDTE.TextSelection selection = window.Document.Selection as EnvDTE.TextSelection; if (selection == null) { return; } selection.GotoLine((int)line.LineNumber); }
private void VirtualMachine_Stopped(object sender, EventArgs e) { vmRunning = false; OnUpdateControls(); DebuggerWorker.CancelAsync(); try { SerialStream.Close(); } catch { } try { if (Gdb != null) { Gdb.Dispose(); } } finally { Gdb = null; } if (restartingVM) { return; } if (Bootstrap.Parameters.ContainsKey("start")) { Application.Exit(); } }
private void StopVMButton_Click(object sender, EventArgs e) { if (!Gdb.Running) { Gdb.Dispose(); } VirtualMachine.Stop(); }
private void StepLineButton_Click(object sender, EventArgs e) { if (Gdb.Running) { return; } PdbLineNumber origin, line; origin = PdbSession.FindLinesByVirtualAddress(Gdb.Registers.Eip, 1).FirstOrDefault(); while (true) { Gdb.Step(); line = PdbSession.FindLinesByVirtualAddress(Gdb.Registers.Eip, 1).FirstOrDefault(); if (line == null) { continue; } if (origin == null && line != null) { break; } if (line.SourceFileId != origin.SourceFileId) { break; } if (line.LineNumber != origin.LineNumber || line.ColumnNumber != origin.ColumnNumber) { break; } } OnUpdateControls(); OnUpdate(); PdbSourceFile sourceFile = line.SourceFile; if (sourceFile == null) { return; } EnvDTE.Window window = VisualStudio.Instance.ItemOperations.OpenFile(sourceFile.FileName); EnvDTE.TextSelection selection = window.Document.Selection as EnvDTE.TextSelection; if (selection == null) { return; } selection.GotoLine((int)line.LineNumber); }
private void ContinueButton_Click(object sender, EventArgs e) { if (Gdb.Running) { return; } Gdb.Continue(); OnUpdateControls(); }
private void BreakButton_Click(object sender, EventArgs e) { if (!Gdb.Running) { return; } Gdb.Break(); OnUpdateControls(); OnUpdate(); }
private void RestartVMButton_Click(object sender, EventArgs e) { restartingVM = true; if (!Gdb.Running) { Gdb.Dispose(); } DebuggerWorker.CancelAsync(); VirtualMachine.Restart(); restartingVM = false; }
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { if (Bootstrap.Parameters.ContainsKey("start")) { if (Gdb != null && !Gdb.Running) { Gdb.Continue(); } VirtualMachine.Stop(); } Application.Exit(); }
private void Gdb_BreakpointHit(GdbStub gdbStub, GdbBreakpointHitData breakpointHitData) { ulong address = breakpointHitData.Address; // Debugger::Break() function if (address == debuggerBreakFunction.VirtualAddress) { Gdb.Registers.Eip++; Gdb.Step(); } // TODO: Autoselect right frame Invoke(new MethodInvoker(() => { Activate(); OnUpdateControls(); OnUpdate(); })); }
private void SerialStream_Read(IAsyncResult asyncResult) { int count = SerialStream.EndRead(asyncResult); if (count != 1) { try { SerialStream.Close(); Gdb.Dispose(); } catch { } SerialStream = new NamedPipeServerStream("System", PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); SerialStream.BeginWaitForConnection(SerialStream_WaitForConnection, null); return; } SerialStream_ReadByte(buffer[0]); SerialStream.BeginRead(buffer, 0, 1, SerialStream_Read, null); }
private void StepOverButton_Click(object sender, EventArgs e) { if (Gdb.Running) { return; } List <PdbLineNumber> lines = PdbSession.FindLinesByVirtualAddress(Gdb.Registers.Eip, 100).ToList(); if (lines.Count < 1) { StepLineButton_Click(sender, e); return; } PdbLineNumber currentLine = lines.First(); PdbLineNumber nextLine = currentLine == null ? null : lines.FirstOrDefault(l => l.SourceFileId == currentLine.SourceFileId && l.VirtualAddress > currentLine.VirtualAddress); if (nextLine == null) { StepLineButton_Click(sender, e); return; } PdbLineNumber line = null; while (true) { Gdb.Step(); line = PdbSession.FindLinesByVirtualAddress(Gdb.Registers.Eip, 1).FirstOrDefault(); if (line == null) { continue; } if (line.SourceFileId == nextLine.SourceFileId && line.LineNumber == nextLine.LineNumber && line.ColumnNumber == nextLine.ColumnNumber) { break; } } OnUpdateControls(); OnUpdate(); PdbSourceFile sourceFile = line.SourceFile; if (sourceFile == null) { return; } EnvDTE.Window window = VisualStudio.Instance.ItemOperations.OpenFile(sourceFile.FileName); EnvDTE.TextSelection selection = window.Document.Selection as EnvDTE.TextSelection; if (selection == null) { return; } selection.GotoLine((int)line.LineNumber); }