diff --git a/Build/Tools/gdb.exe b/Build/Tools/gdb.exe index 7a8c966b4..c11567bdb 100644 Binary files a/Build/Tools/gdb.exe and b/Build/Tools/gdb.exe differ diff --git a/source2/Debug/Cosmos.Debug.GDB/FormBreakpoints.cs b/source2/Debug/Cosmos.Debug.GDB/FormBreakpoints.cs index 0c5f56240..513104ba7 100644 --- a/source2/Debug/Cosmos.Debug.GDB/FormBreakpoints.cs +++ b/source2/Debug/Cosmos.Debug.GDB/FormBreakpoints.cs @@ -29,7 +29,7 @@ namespace Cosmos.Debug.GDB { } public void OnDelete(GDB.Response aResponse) { - var xSplit = aResponse.Reply.Split(' '); + string[] xSplit = aResponse.Reply.Split(' '); int xID = int.Parse(xSplit[1]); var xUC = mBreakpoints[xID]; mBreakpoints.Remove(xID); diff --git a/source2/Debug/Cosmos.Debug.GDB/FormLog.Designer.cs b/source2/Debug/Cosmos.Debug.GDB/FormLog.Designer.cs index bd09a0883..25fabeb9a 100644 --- a/source2/Debug/Cosmos.Debug.GDB/FormLog.Designer.cs +++ b/source2/Debug/Cosmos.Debug.GDB/FormLog.Designer.cs @@ -23,148 +23,148 @@ /// the contents of this method with the code editor. /// private void InitializeComponent() { - this.menuStrip1 = new System.Windows.Forms.MenuStrip(); - this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.mitmCopyToClipboard = new System.Windows.Forms.ToolStripMenuItem(); - this.mitmClear = new System.Windows.Forms.ToolStripMenuItem(); - this.panel2 = new System.Windows.Forms.Panel(); - this.butnSendCmd = new System.Windows.Forms.Button(); - this.textSendCmd = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.panel1 = new System.Windows.Forms.Panel(); - this.lboxDebug = new System.Windows.Forms.ListBox(); - this.lboxCmd = new System.Windows.Forms.ListBox(); - this.menuStrip1.SuspendLayout(); - this.panel2.SuspendLayout(); - this.panel1.SuspendLayout(); - this.SuspendLayout(); - // - // menuStrip1 - // - this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mitmCopyToClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.mitmClear = new System.Windows.Forms.ToolStripMenuItem(); + this.panel2 = new System.Windows.Forms.Panel(); + this.butnSendCmd = new System.Windows.Forms.Button(); + this.textSendCmd = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.lboxDebug = new System.Windows.Forms.ListBox(); + this.lboxCmd = new System.Windows.Forms.ListBox(); + this.menuStrip1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem}); - this.menuStrip1.Location = new System.Drawing.Point(0, 0); - this.menuStrip1.Name = "menuStrip1"; - this.menuStrip1.Size = new System.Drawing.Size(489, 24); - this.menuStrip1.TabIndex = 6; - this.menuStrip1.Text = "menuStrip1"; - // - // fileToolStripMenuItem - // - this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(489, 24); + this.menuStrip1.TabIndex = 6; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.mitmCopyToClipboard, this.mitmClear}); - this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; - this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); - this.fileToolStripMenuItem.Text = "&File"; - // - // mitmCopyToClipboard - // - this.mitmCopyToClipboard.Name = "mitmCopyToClipboard"; - this.mitmCopyToClipboard.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); - this.mitmCopyToClipboard.Size = new System.Drawing.Size(213, 22); - this.mitmCopyToClipboard.Text = "&Copy to Clipboard"; - this.mitmCopyToClipboard.Click += new System.EventHandler(this.mitmCopyToClipboard_Click); - // - // mitmClear - // - this.mitmClear.Name = "mitmClear"; - this.mitmClear.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.L))); - this.mitmClear.Size = new System.Drawing.Size(213, 22); - this.mitmClear.Text = "C&lear"; - this.mitmClear.Click += new System.EventHandler(this.mitmClear_Click); - // - // panel2 - // - this.panel2.Controls.Add(this.butnSendCmd); - this.panel2.Controls.Add(this.textSendCmd); - this.panel2.Controls.Add(this.label1); - this.panel2.Dock = System.Windows.Forms.DockStyle.Top; - this.panel2.Location = new System.Drawing.Point(0, 24); - this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(489, 33); - this.panel2.TabIndex = 10; - // - // butnSendCmd - // - this.butnSendCmd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.butnSendCmd.Location = new System.Drawing.Point(438, 5); - this.butnSendCmd.Name = "butnSendCmd"; - this.butnSendCmd.Size = new System.Drawing.Size(47, 23); - this.butnSendCmd.TabIndex = 2; - this.butnSendCmd.Text = "Send"; - this.butnSendCmd.UseVisualStyleBackColor = true; - this.butnSendCmd.Click += new System.EventHandler(this.butnSendCmd_Click); - // - // textSendCmd - // - this.textSendCmd.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textSendCmd.Location = new System.Drawing.Point(63, 7); - this.textSendCmd.Name = "textSendCmd"; - this.textSendCmd.Size = new System.Drawing.Size(370, 20); - this.textSendCmd.TabIndex = 1; - this.textSendCmd.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textSendCmd_KeyPress); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(4, 10); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(57, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Command:"; - // - // panel1 - // - this.panel1.Controls.Add(this.lboxDebug); - this.panel1.Controls.Add(this.lboxCmd); - this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel1.Location = new System.Drawing.Point(0, 57); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(489, 317); - this.panel1.TabIndex = 11; - // - // lboxDebug - // - this.lboxDebug.Dock = System.Windows.Forms.DockStyle.Fill; - this.lboxDebug.FormattingEnabled = true; - this.lboxDebug.Location = new System.Drawing.Point(188, 0); - this.lboxDebug.Name = "lboxDebug"; - this.lboxDebug.Size = new System.Drawing.Size(301, 316); - this.lboxDebug.TabIndex = 9; - // - // lboxCmd - // - this.lboxCmd.Dock = System.Windows.Forms.DockStyle.Left; - this.lboxCmd.FormattingEnabled = true; - this.lboxCmd.Location = new System.Drawing.Point(0, 0); - this.lboxCmd.Name = "lboxCmd"; - this.lboxCmd.Size = new System.Drawing.Size(188, 316); - this.lboxCmd.TabIndex = 7; - this.lboxCmd.SelectedIndexChanged += new System.EventHandler(this.lboxCmd_SelectedIndexChanged); - // - // FormLog - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(489, 374); - this.Controls.Add(this.panel1); - this.Controls.Add(this.panel2); - this.Controls.Add(this.menuStrip1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; - this.MainMenuStrip = this.menuStrip1; - this.Name = "FormLog"; - this.ShowInTaskbar = false; - this.Text = "Debug Log"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormLog_FormClosing); - this.menuStrip1.ResumeLayout(false); - this.menuStrip1.PerformLayout(); - this.panel2.ResumeLayout(false); - this.panel2.PerformLayout(); - this.panel1.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "&File"; + // + // mitmCopyToClipboard + // + this.mitmCopyToClipboard.Name = "mitmCopyToClipboard"; + this.mitmCopyToClipboard.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); + this.mitmCopyToClipboard.Size = new System.Drawing.Size(213, 22); + this.mitmCopyToClipboard.Text = "&Copy to Clipboard"; + this.mitmCopyToClipboard.Click += new System.EventHandler(this.mitmCopyToClipboard_Click); + // + // mitmClear + // + this.mitmClear.Name = "mitmClear"; + this.mitmClear.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.L))); + this.mitmClear.Size = new System.Drawing.Size(213, 22); + this.mitmClear.Text = "C&lear"; + this.mitmClear.Click += new System.EventHandler(this.mitmClear_Click); + // + // panel2 + // + this.panel2.Controls.Add(this.butnSendCmd); + this.panel2.Controls.Add(this.textSendCmd); + this.panel2.Controls.Add(this.label1); + this.panel2.Dock = System.Windows.Forms.DockStyle.Top; + this.panel2.Location = new System.Drawing.Point(0, 24); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(489, 33); + this.panel2.TabIndex = 10; + // + // butnSendCmd + // + this.butnSendCmd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.butnSendCmd.Location = new System.Drawing.Point(438, 5); + this.butnSendCmd.Name = "butnSendCmd"; + this.butnSendCmd.Size = new System.Drawing.Size(47, 23); + this.butnSendCmd.TabIndex = 2; + this.butnSendCmd.Text = "Send"; + this.butnSendCmd.UseVisualStyleBackColor = true; + this.butnSendCmd.Click += new System.EventHandler(this.butnSendCmd_Click); + // + // textSendCmd + // + this.textSendCmd.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textSendCmd.Location = new System.Drawing.Point(63, 7); + this.textSendCmd.Name = "textSendCmd"; + this.textSendCmd.Size = new System.Drawing.Size(370, 20); + this.textSendCmd.TabIndex = 1; + this.textSendCmd.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textSendCmd_KeyPress); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(4, 10); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(57, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Command:"; + // + // panel1 + // + this.panel1.Controls.Add(this.lboxDebug); + this.panel1.Controls.Add(this.lboxCmd); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 57); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(489, 317); + this.panel1.TabIndex = 11; + // + // lboxDebug + // + this.lboxDebug.Dock = System.Windows.Forms.DockStyle.Fill; + this.lboxDebug.FormattingEnabled = true; + this.lboxDebug.Location = new System.Drawing.Point(188, 0); + this.lboxDebug.Name = "lboxDebug"; + this.lboxDebug.Size = new System.Drawing.Size(301, 317); + this.lboxDebug.TabIndex = 9; + // + // lboxCmd + // + this.lboxCmd.Dock = System.Windows.Forms.DockStyle.Left; + this.lboxCmd.FormattingEnabled = true; + this.lboxCmd.Location = new System.Drawing.Point(0, 0); + this.lboxCmd.Name = "lboxCmd"; + this.lboxCmd.Size = new System.Drawing.Size(188, 317); + this.lboxCmd.TabIndex = 7; + this.lboxCmd.SelectedIndexChanged += new System.EventHandler(this.lboxCmd_SelectedIndexChanged); + // + // FormLog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(489, 374); + this.Controls.Add(this.panel1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.menuStrip1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; + this.MainMenuStrip = this.menuStrip1; + this.Name = "FormLog"; + this.ShowInTaskbar = false; + this.Text = "Debug Log"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormLog_FormClosing); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); } diff --git a/source2/Debug/Cosmos.Debug.GDB/FormLog.cs b/source2/Debug/Cosmos.Debug.GDB/FormLog.cs index af2ccac4d..2c12a73a5 100644 --- a/source2/Debug/Cosmos.Debug.GDB/FormLog.cs +++ b/source2/Debug/Cosmos.Debug.GDB/FormLog.cs @@ -54,11 +54,17 @@ namespace Cosmos.Debug.GDB { if (xResponse.Error) { lboxDebug.Items.Add("ERROR: " + xResponse.ErrorMsg); } - lboxDebug.Items.Add(""); + lboxDebug.Items.Add(string.Empty); foreach (var x in xResponse.Text) { lboxDebug.Items.Add(x); } + + if (xResponse.Reply != xResponse.Command) + { + lboxDebug.Items.Add(string.Empty); + lboxDebug.Items.Add(xResponse.Reply); + } } } diff --git a/source2/Debug/Cosmos.Debug.GDB/FormLog.resx b/source2/Debug/Cosmos.Debug.GDB/FormLog.resx index 69c56499b..25d918dd9 100644 --- a/source2/Debug/Cosmos.Debug.GDB/FormLog.resx +++ b/source2/Debug/Cosmos.Debug.GDB/FormLog.resx @@ -112,12 +112,12 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 \ No newline at end of file diff --git a/source2/Debug/Cosmos.Debug.GDB/FormMain.Designer.cs b/source2/Debug/Cosmos.Debug.GDB/FormMain.Designer.cs index f23ac911c..ec3bd8e2a 100644 --- a/source2/Debug/Cosmos.Debug.GDB/FormMain.Designer.cs +++ b/source2/Debug/Cosmos.Debug.GDB/FormMain.Designer.cs @@ -25,6 +25,7 @@ private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.panel1 = new System.Windows.Forms.Panel(); + this.butnBreak = new System.Windows.Forms.Button(); this.butnBreakpoints = new System.Windows.Forms.Button(); this.lablRunning = new System.Windows.Forms.Label(); this.lablConnected = new System.Windows.Forms.Label(); @@ -42,6 +43,7 @@ this.mitmStepOver = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); this.mitmContinue = new System.Windows.Forms.ToolStripMenuItem(); + this.mitmBreak = new System.Windows.Forms.ToolStripMenuItem(); this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.mitmViewBreakpoints = new System.Windows.Forms.ToolStripMenuItem(); this.mitmMainViewCallStack = new System.Windows.Forms.ToolStripMenuItem(); @@ -65,6 +67,7 @@ // // panel1 // + this.panel1.Controls.Add(this.butnBreak); this.panel1.Controls.Add(this.butnBreakpoints); this.panel1.Controls.Add(this.lablRunning); this.panel1.Controls.Add(this.lablConnected); @@ -76,9 +79,19 @@ this.panel1.Size = new System.Drawing.Size(589, 30); this.panel1.TabIndex = 3; // + // butnBreak + // + this.butnBreak.Location = new System.Drawing.Point(117, 4); + this.butnBreak.Name = "butnBreak"; + this.butnBreak.Size = new System.Drawing.Size(26, 23); + this.butnBreak.TabIndex = 4; + this.butnBreak.Text = "| |"; + this.butnBreak.UseVisualStyleBackColor = true; + this.butnBreak.Click += new System.EventHandler(this.mitmBreak_Click); + // // butnBreakpoints // - this.butnBreakpoints.Location = new System.Drawing.Point(118, 3); + this.butnBreakpoints.Location = new System.Drawing.Point(152, 4); this.butnBreakpoints.Name = "butnBreakpoints"; this.butnBreakpoints.Size = new System.Drawing.Size(75, 23); this.butnBreakpoints.TabIndex = 2; @@ -110,19 +123,19 @@ // // butnContinue // - this.butnContinue.Location = new System.Drawing.Point(70, 4); + this.butnContinue.Location = new System.Drawing.Point(87, 4); this.butnContinue.Name = "butnContinue"; this.butnContinue.Size = new System.Drawing.Size(26, 23); this.butnContinue.TabIndex = 1; this.butnContinue.Text = ">"; this.butnContinue.UseVisualStyleBackColor = true; - this.butnContinue.Click += new System.EventHandler(this.continueToolStripMenuItem_Click); + this.butnContinue.Click += new System.EventHandler(this.mitmContinue_Click); // // butnConnect // this.butnConnect.Location = new System.Drawing.Point(3, 3); this.butnConnect.Name = "butnConnect"; - this.butnConnect.Size = new System.Drawing.Size(56, 23); + this.butnConnect.Size = new System.Drawing.Size(78, 23); this.butnConnect.TabIndex = 0; this.butnConnect.Text = "Connect"; this.butnConnect.UseVisualStyleBackColor = true; @@ -194,7 +207,8 @@ this.mitmStepInto, this.mitmStepOver, this.toolStripMenuItem1, - this.mitmContinue}); + this.mitmContinue, + this.mitmBreak}); this.executeToolStripMenuItem.Name = "executeToolStripMenuItem"; this.executeToolStripMenuItem.Size = new System.Drawing.Size(40, 20); this.executeToolStripMenuItem.Text = "&Run"; @@ -226,7 +240,15 @@ this.mitmContinue.ShortcutKeys = System.Windows.Forms.Keys.F5; this.mitmContinue.Size = new System.Drawing.Size(150, 22); this.mitmContinue.Text = "&Continue"; - this.mitmContinue.Click += new System.EventHandler(this.continueToolStripMenuItem_Click); + this.mitmContinue.Click += new System.EventHandler(this.mitmContinue_Click); + // + // mitmBreak + // + this.mitmBreak.Name = "mitmBreak"; + this.mitmBreak.ShortcutKeys = System.Windows.Forms.Keys.F6; + this.mitmBreak.Size = new System.Drawing.Size(150, 22); + this.mitmBreak.Text = "&Break"; + this.mitmBreak.Click += new System.EventHandler(this.mitmBreak_Click); // // viewToolStripMenuItem // @@ -367,7 +389,7 @@ this.Name = "FormMain"; this.Text = "Cosmos GDB Debugger"; this.Activated += new System.EventHandler(this.FormMain_Activated); - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormMain_FormClosing); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormMain_FormClosed); this.Load += new System.EventHandler(this.FormMain_Load); this.Shown += new System.EventHandler(this.FormMain_Shown); this.Resize += new System.EventHandler(this.FormMain_Resize); @@ -418,6 +440,8 @@ private System.Windows.Forms.ToolStripMenuItem mitemDisassemblyAddBreakpoint; private System.Windows.Forms.ToolStripMenuItem mitmCopyToClipboard; private System.Windows.Forms.Button butnBreakpoints; + private System.Windows.Forms.Button butnBreak; + private System.Windows.Forms.ToolStripMenuItem mitmBreak; } } diff --git a/source2/Debug/Cosmos.Debug.GDB/FormMain.cs b/source2/Debug/Cosmos.Debug.GDB/FormMain.cs index 357b040b3..e7e117aef 100644 --- a/source2/Debug/Cosmos.Debug.GDB/FormMain.cs +++ b/source2/Debug/Cosmos.Debug.GDB/FormMain.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; +using System.Runtime.InteropServices; namespace Cosmos.Debug.GDB { public partial class FormMain : Form { @@ -16,6 +17,7 @@ namespace Cosmos.Debug.GDB { public readonly string mLabel; public readonly string mOp; public readonly string mData = string.Empty; + public readonly bool mEIPHere; public AsmLine(string aInput) { //"0x0056d2b9 <_end_data+0>:\tmov DWORD PTR ds:0x550020,ebx\n" @@ -23,10 +25,18 @@ namespace Cosmos.Debug.GDB { var xSplit1 = s.Split(Global.TabSeparator, StringSplitOptions.RemoveEmptyEntries); var xSplit2 = xSplit1[0].Split(Global.SpaceSeparator, StringSplitOptions.RemoveEmptyEntries); - mAddr = Global.FromHexWithLeadingZeroX(xSplit2[0]); + + int xIndex = 0; + //newer gdb above 6.6 or higher versions + if (xSplit2[0] == "=>") + { + mEIPHere = true; + xIndex = 1; + } + mAddr = Global.FromHexWithLeadingZeroX(xSplit2[xIndex]); string xLabel; - if (xSplit2.Length > 1) { - xLabel = xSplit2[1]; + if (xSplit2.Length > xIndex + 1) { + xLabel = xSplit2[xIndex + 1]; } xSplit2 = xSplit1[1].Split(Global.SpaceSeparator, StringSplitOptions.RemoveEmptyEntries); @@ -45,7 +55,10 @@ namespace Cosmos.Debug.GDB { } } + const int MAX_RETRY = 3; protected string mFuncName; + protected bool mCreated; + protected int mConnectRetry; protected void OnGDBResponse(GDB.Response aResponse) { try { @@ -54,21 +67,75 @@ namespace Cosmos.Debug.GDB { if (xCmdLine == "info registers") { Windows.mRegistersForm.UpdateRegisters(aResponse); Windows.UpdateAfterRegisterUpdate(); - } else if (xCmdLine == "") { - // This happens on initial connect + }else if(xCmdLine.Length == 0) { + if (aResponse.Text.Count == 2 && aResponse.Text[0] == "Breakpoint") + { + // program breaks on aResponse.Text[1] + } + else + { + // contains address where we are + } } else { var xCmdParts = xCmdLine.Split(Global.SpaceSeparator); var xCmd = xCmdParts[0]; + bool asyncCmd = false; + if (xCmd.EndsWith("&")) + { + asyncCmd = true; + xCmd = xCmd.Substring(0, xCmd.Length - 1); + } if (xCmd == "disassemble") { OnDisassemble(aResponse); } else if (xCmd == "symbol-file") { // nothing } else if (xCmd == "set") { // nothing - } else if (xCmd == "target") { // nothing + } else if (xCmd == "target") { + + if (Global.GDB.Connected) + { + lablConnected.Visible = true; + lablRunning.Visible = true; + + mitmConnect.Enabled = true; + butnConnect.Enabled = true; + mitmConnect.Text = "&Disconnect"; + butnConnect.Text = "&Disconnect"; + + Settings.InitWindows(); + } + else + { + if (mConnectRetry < MAX_RETRY + 1) + { + Connect(); + } + else + { + mitmConnect.Enabled = true; + butnConnect.Enabled = true; + mitmConnect.Text = "&Connect"; + butnConnect.Text = "&Connect"; + } + } + } else if (xCmd == "detach") { + if (false == Global.GDB.Connected) + { + mitmConnect.Text = "&Connect"; + butnConnect.Text = "&Connect"; + mitmContinue.Enabled = false; + butnContinue.Enabled = false; + mitmStepInto.Enabled = false; + mitmStepOver.Enabled = false; + lboxDisassemble.Items.Clear(); + lablConnected.Visible = false; + lablRunning.Visible = false; + textCurrentFunction.Visible = false; + } } else if (xCmd == "delete") { Windows.mBreakpointsForm.OnDelete(aResponse); - } else if ((xCmd == "stepi") || (xCmd == "nexti") || (xCmd == "continue")) { - lablRunning.Text = "Stopped"; - Windows.UpdateAllWindows(); + } else if ((xCmd == "stepi") || (xCmd == "nexti")) { + } else if (xCmd == "continue" || xCmd== "fg") { + lboxDisassemble.Items.Clear(); } else if (xCmd == "where") { Windows.mCallStackForm.OnWhere(aResponse); } else if (xCmd == "break") { @@ -87,7 +154,12 @@ namespace Cosmos.Debug.GDB { public void Disassemble(string aLabel) { textCurrentFunction.Text = string.Empty; textCurrentFunction.Visible = true; - Global.GDB.SendCmd("disassemble " + aLabel.TrimEnd()); + // force space free at end + var xDisAsmCmd = "disassemble"; + var xLabelTrimed = aLabel.TrimEnd(); + if (xLabelTrimed.Length > 0) + xDisAsmCmd += " " + xLabelTrimed; + Global.GDB.SendCmd(xDisAsmCmd); } protected void OnDisassemble(GDB.Response xResponse) { @@ -136,45 +208,84 @@ namespace Cosmos.Debug.GDB { } private void mitmStepInto_Click(object sender, EventArgs e) { - lablRunning.Text = "Running"; Global.GDB.SendCmd("stepi"); } private void mitmStepOver_Click(object sender, EventArgs e) { - lablRunning.Text = "Running"; Global.GDB.SendCmd("nexti"); } - protected void Connect(int aRetry) { - if (!mitmConnect.Enabled) { - return; - } + protected void Connect() { mitmConnect.Enabled = false; butnConnect.Enabled = false; - Windows.CreateForms(); - Global.AsmSource = new AsmFile(Path.Combine(Settings.OutputPath, Settings.AsmFile)); - Global.GDB = new GDB(aRetry, OnGDBResponse); - if (Global.GDB.Connected) { - lablConnected.Visible = true; - lablRunning.Visible = true; - lablRunning.Text = "Stopped"; - Settings.InitWindows(); - Windows.UpdateAllWindows(); - } + mitmConnect.Text = "Try " + mConnectRetry; + butnConnect.Text = "Try " + mConnectRetry++; + + if (false == mCreated) + { + Windows.CreateForms(); + Global.AsmSource = new AsmFile(Path.Combine(Settings.OutputPath, Settings.AsmFile)); + Global.GDB = new GDB(OnGDBResponse, OnRunStateChanged); + mCreated = true; + } + Global.GDB.Connect(); } + private void OnRunStateChanged(bool stopped) + { + if (InvokeRequired) + { + Invoke((MethodInvoker) delegate{OnRunStateChanged(stopped);}); + return; + } + if (stopped) + { + lablRunning.Text = "Stopped"; + mitmContinue.Enabled = true; + butnContinue.Enabled = true; + mitmBreak.Enabled = false; + butnBreak.Enabled = false; + mitmConnect.Enabled = true; + butnConnect.Enabled = true; + mitmStepInto.Enabled = true; + mitmStepOver.Enabled = true; + Windows.UpdateAllWindows(); + } + else + { + lablRunning.Text = "Running"; + mitmContinue.Enabled = false; + butnContinue.Enabled = false; + mitmBreak.Enabled = true; + butnBreak.Enabled = true; + mitmConnect.Enabled = false; + butnConnect.Enabled = false; + mitmStepInto.Enabled = false; + mitmStepOver.Enabled = false; + } + } + private void mitmConnect_Click(object sender, EventArgs e) { - Connect(30); + if (!mitmConnect.Enabled) + return; + if (mCreated && Global.GDB.Connected) + { + Global.GDB.Disconnect(); + } + else + { + mConnectRetry = 1; + Connect(); + } } private void mitmRefresh_Click(object sender, EventArgs e) { Windows.UpdateAllWindows(); } - private void continueToolStripMenuItem_Click(object sender, EventArgs e) { - lablRunning.Text = "Running"; - Global.GDB.SendCmd("continue"); + private void mitmContinue_Click(object sender, EventArgs e) { + Global.GDB.SendCmd("continue&"); } private void mitmMainViewCallStack_Click(object sender, EventArgs e) { @@ -214,13 +325,21 @@ namespace Cosmos.Debug.GDB { } private void FormMain_Shown(object sender, EventArgs e) { + mitmContinue.Enabled = false; + butnContinue.Enabled = false; + mitmBreak.Enabled = false; + butnBreak.Enabled = false; + mitmStepInto.Enabled = false; + mitmStepOver.Enabled = false; + // Dont put this in load. Load happens in main call from Main.cs and on exceptions just - // goes out, no message. + // goes out, no message. // Also we want to show other forms after main form, not before. // We also only want to run this once, not on each possible show. if (mitmConnect.Enabled) { if (Settings.AutoConnect) { - Connect(30); + mConnectRetry = 1; + Connect(); } } } @@ -269,9 +388,6 @@ namespace Cosmos.Debug.GDB { Clipboard.SetText(x.ToString()); } - private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { - } - private void butnBreakpoints_Click(object sender, EventArgs e) { mitmViewBreakpoints.PerformClick(); } @@ -284,5 +400,18 @@ namespace Cosmos.Debug.GDB { textCurrentFunction.Width = (int)size.Width + textCurrentFunction.Padding.Horizontal; } } + + private void mitmBreak_Click(object sender, EventArgs e) { + Global.GDB.SendCmd("-exec-interrupt"); + } + + private void FormMain_FormClosed(object sender, FormClosedEventArgs e) + { + if (mCreated && Global.GDB.Connected) + { + Global.GDB.Disconnect(); + Global.GDB.SendCmd("quit"); + } + } } } \ No newline at end of file diff --git a/source2/Debug/Cosmos.Debug.GDB/GDB.cs b/source2/Debug/Cosmos.Debug.GDB/GDB.cs index 2efafa2bc..40a214177 100644 --- a/source2/Debug/Cosmos.Debug.GDB/GDB.cs +++ b/source2/Debug/Cosmos.Debug.GDB/GDB.cs @@ -7,6 +7,7 @@ using System.Text; using System.Threading; using Registry = Microsoft.Win32.Registry; using Path = System.IO.Path; +using System.Runtime.InteropServices; namespace Cosmos.Debug.GDB { public class GDB { @@ -23,8 +24,9 @@ namespace Cosmos.Debug.GDB { } protected Queue mLastCmd = new Queue(); - protected System.Diagnostics.Process mGDBProcess; + public System.Diagnostics.Process mGDBProcess; protected Action mOnResponse; + protected Action mOnRunStateChange; protected List mBuffer = new List(); // DO NOT change to sync reads.. with process output there are SERIOUS bugs in the StreamReader.. @@ -33,19 +35,67 @@ namespace Cosmos.Debug.GDB { // StreamReader in general has other issues on non seekable streams as well and accounts for why even our // implementation looks poor in places. void mGDBProcess_OutputDataReceived(object sender, DataReceivedEventArgs e) { - string xData = e.Data.Trim(); - if (xData == "(gdb)") { - ProcessResponse(); - } else { - mBuffer.Add(xData); - } + all.Add(e.Data); + if (e.Data == null) + return; + ProcessResponse(e.Data); } - protected void ProcessResponse() { + bool firstRun = true; + + List all = new List(); + protected bool m_IsStopped = true; + + void OnRunStateChanged(bool stopped) + { + m_IsStopped = stopped; + mOnRunStateChange(stopped); + } + + protected void ProcessResponse(string line) { + switch (line) + { + case "(gdb) ": + if (firstRun) + { + // remove start things, like versions etc. + mBuffer.Clear(); + firstRun = false; + return; + } + else if (mBuffer.Count == 0) + { + // occures if CTRL + C the program breaks + return; + } + break; + default: + // only 7.x + if (line[0] == '*') + { // represents start or stopped + int xIndex = line.IndexOf(','); + string xState = line.Substring(1, xIndex - 1); + switch (xState) + { + case "stopped": + OnRunStateChanged(true); + break; + case "running": + OnRunStateChanged(false); + break; + } + } + else + mBuffer.Add(line); + return; + } var xResponse = new Response(); - lock (mLastCmd) { - xResponse.Command = mLastCmd.Dequeue(); - } + + string xCmd = mBuffer[0]; + if (xCmd[0] == '&') + { + xResponse.Command = Unescape(xCmd.Substring(1)); + } foreach (string xLine in mBuffer) { var xType = xLine[0]; @@ -65,16 +115,33 @@ namespace Cosmos.Debug.GDB { string sData = Unescape(xLine.Substring(1)); if (xType == '&') { - xResponse.Reply = sData; - } else if (xType == '^') { - xResponse.Error = sData != "done"; + if (xResponse.Reply.Length == 0) + xResponse.Reply = sData; + else + xResponse.Reply += Environment.NewLine + sData; } else if (xType == '~') { xResponse.Text.Add(Unescape(sData)); } + else if (xType == '^') { + xResponse.Error = sData.StartsWith("error"); + } } mBuffer.Clear(); - Windows.mMainForm.Invoke(mOnResponse, new object[] { xResponse }); + + // detect manual input of cmds + var xSplit = xResponse.Command.Split(new char[]{' ', '\t'}, StringSplitOptions.RemoveEmptyEntries); + if (xSplit.Length == 1 && xSplit[0] == "detach") + { + if (false == xResponse.Error) + mConnected = false; + } + else if (xSplit.Length > 2 && xSplit[0] == "target" && xSplit[1] == "remote") + { + TargetCmdReply(xResponse); + } + if (false == Windows.mMainForm.IsDisposed) + Windows.mMainForm.Invoke(mOnResponse, new object[] { xResponse }); } static public string Unescape(string aInput) { @@ -89,10 +156,8 @@ namespace Cosmos.Debug.GDB { } public void SendCmd(string aCmd) { - lock (mLastCmd) { - mLastCmd.Enqueue(aCmd); - } - mGDBProcess.StandardInput.WriteLine(aCmd); + all.Add("Cmd: " + aCmd); + mGDBProcess.StandardInput.WriteLine(aCmd); } protected bool mConnected = false; @@ -100,6 +165,11 @@ namespace Cosmos.Debug.GDB { get { return mConnected; } } + public bool Stopped + { + get { return m_IsStopped; } + } + static readonly string mGDBExePath; static GDB() @@ -113,49 +183,59 @@ namespace Cosmos.Debug.GDB { } } - public GDB(int aRetry, Action aOnResponse) { + public GDB(Action aOnResponse, Action aOnRunStateChange) + { mOnResponse = aOnResponse; - // To handle greeting from GDB since its not associated with any command - mLastCmd.Enqueue(string.Empty); + mOnRunStateChange = aOnRunStateChange; var xStartInfo = new ProcessStartInfo(); xStartInfo.FileName = mGDBExePath; - xStartInfo.Arguments = @"--interpreter=mi2"; + xStartInfo.Arguments = @"--interpreter=mi2 -silent -nx"; xStartInfo.WorkingDirectory = Settings.OutputPath; xStartInfo.CreateNoWindow = true; xStartInfo.UseShellExecute = false; xStartInfo.RedirectStandardError = true; xStartInfo.RedirectStandardInput = true; xStartInfo.RedirectStandardOutput = true; + mGDBProcess = System.Diagnostics.Process.Start(xStartInfo); - mGDBProcess.StandardInput.AutoFlush = true; mGDBProcess.OutputDataReceived += new DataReceivedEventHandler(mGDBProcess_OutputDataReceived); mGDBProcess.BeginOutputReadLine(); - mConnected = true; - + SendCmd("set target-async 1"); // doc http://sourceware.org/gdb/onlinedocs/gdb/Asynchronous-and-non_002dstop-modes.html SendCmd("symbol-file " + Settings.ObjFile); - SendCmd("target remote :8832"); - - //while (!mConnected) { - // var x = SendCmd("target remote :8832"); - // mConnected = !x.Error; - // aRetry--; - // if (aRetry == 0) { - // return; - // } - - // System.Threading.Thread.Sleep(1000); - // System.Windows.Forms.Application.DoEvents(); - //} - - SendCmd("set architecture i386"); - SendCmd("set language asm"); - SendCmd("set disassembly-flavor intel"); - SendCmd("break Kernel_Start"); - SendCmd("continue"); - SendCmd("delete 1"); + SendCmd("set architecture i386"); + SendCmd("set language asm"); + SendCmd("set disassembly-flavor intel"); } + + public void Connect() + { + SendCmd("target remote :8832"); + } + + public void Disconnect() + { + SendCmd("detach"); + } + + protected void TargetCmdReply(Response res) + { + mConnected = !res.Error; + if (false == res.Error) + { + // get current address + var xAddr = Global.FromHexWithLeadingZeroX(res.Text[1].Substring(0, res.Text[1].IndexOf(' '))); + // only use breakpoint if not already deep in OS + const int START_ADDRESS = 0x000ffff0; + if (xAddr <= START_ADDRESS) + { + SendCmd("break Kernel_Start"); + SendCmd("continue"); + SendCmd("delete 1"); + } + } + } } } \ No newline at end of file diff --git a/source2/Debug/Cosmos.Debug.GDB/Program.cs b/source2/Debug/Cosmos.Debug.GDB/Program.cs index 6a69de358..81b56fc3b 100644 --- a/source2/Debug/Cosmos.Debug.GDB/Program.cs +++ b/source2/Debug/Cosmos.Debug.GDB/Program.cs @@ -1,19 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; +using Environment = System.Environment; +using STAThread = System.STAThreadAttribute; +using Application = System.Windows.Forms.Application; namespace Cosmos.Debug.GDB { static class Program { [STAThread] static void Main() { - var xArgs = System.Environment.GetCommandLineArgs(); + var xArgs = Environment.GetCommandLineArgs(); if (xArgs.Length > 1) { if (false == Settings.Load(xArgs[1])) return; } if (xArgs.Length > 2) { - //Settings.AutoConnect = string.Compare(xArgs[2], "/Connect", true) == 0; + Settings.AutoConnect = string.Compare(xArgs[2], "/Connect", true) == 0; } Application.EnableVisualStyles(); diff --git a/source2/Debug/Cosmos.Debug.GDB/Windows.cs b/source2/Debug/Cosmos.Debug.GDB/Windows.cs index 3f555b14b..a1241853a 100644 --- a/source2/Debug/Cosmos.Debug.GDB/Windows.cs +++ b/source2/Debug/Cosmos.Debug.GDB/Windows.cs @@ -94,9 +94,9 @@ namespace Cosmos.Debug.GDB { } static public void UpdateAllWindows() { - Windows.mMainForm.Disassemble(""); + Windows.mMainForm.Disassemble(string.Empty); Windows.mRegistersForm.Redo(); - Windows.mCallStackForm.Redo(); + Windows.mCallStackForm.Redo(); } static public void UpdateAfterRegisterUpdate() @@ -129,4 +129,4 @@ namespace Cosmos.Debug.GDB { mVisibleWindows.Clear(); } } -} +} \ No newline at end of file