Пример #1
0
        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);
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
        private void StopVMButton_Click(object sender, EventArgs e)
        {
            if (!Gdb.Running)
            {
                Gdb.Dispose();
            }

            VirtualMachine.Stop();
        }
Пример #4
0
        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);
        }
Пример #5
0
        private void ContinueButton_Click(object sender, EventArgs e)
        {
            if (Gdb.Running)
            {
                return;
            }

            Gdb.Continue();

            OnUpdateControls();
        }
Пример #6
0
        private void BreakButton_Click(object sender, EventArgs e)
        {
            if (!Gdb.Running)
            {
                return;
            }

            Gdb.Break();

            OnUpdateControls();
            OnUpdate();
        }
Пример #7
0
        private void RestartVMButton_Click(object sender, EventArgs e)
        {
            restartingVM = true;

            if (!Gdb.Running)
            {
                Gdb.Dispose();
            }

            DebuggerWorker.CancelAsync();
            VirtualMachine.Restart();

            restartingVM = false;
        }
Пример #8
0
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (Bootstrap.Parameters.ContainsKey("start"))
            {
                if (Gdb != null && !Gdb.Running)
                {
                    Gdb.Continue();
                }

                VirtualMachine.Stop();
            }

            Application.Exit();
        }
Пример #9
0
        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();
            }));
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
        }