diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/Commands/MemoryPadCommands.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/Commands/MemoryPadCommands.cs index c75d7a6f19..6c0809a1a5 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/Commands/MemoryPadCommands.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/Commands/MemoryPadCommands.cs @@ -119,7 +119,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads { if (this.pad != null && this.comboBox != null) { pad.DisplayByteSize = Convert.ToByte(this.comboBox.SelectedValue); - pad.Refresh(); + pad.ChangeByteDisplay(); } base.Run(); } diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/MemoryPad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/MemoryPad.cs index 4c0ea07ba5..914d7cfb05 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/MemoryPad.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/MemoryPad.cs @@ -22,6 +22,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads ConsoleControl console; int columnsNumber = 16; byte displayByteSize = 1; + byte[] memory; + Process debuggedProcess; + List> memoryAddresses = new List>(); + Dictionary addressesMapping = new Dictionary(); /// /// Gets or sets the number of columns in the display @@ -55,10 +59,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads } } - Process debuggedProcess; - List> memoryAddresses = new List>(); - Dictionary addressesMapping = new Dictionary(); - public MemoryPad() { this.console = new ConsoleControl(); @@ -74,6 +74,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads { memoryAddresses.Clear(); addressesMapping.Clear(); + memory = null; } protected override ToolBar BuildToolBar() @@ -91,12 +92,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads currentAddressIndex = 0; } - public override void RefreshPad() - { - Refresh(); - base.RefreshPad(); - } - public void JumpToAddress(string address) { try { @@ -173,11 +168,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads return false; } - console.Append(DoWork()); + RetrieveMemory(); return true; } - string DoWork() + void RetrieveMemory() { // refresh data addressesMapping.Clear(); @@ -187,38 +182,54 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads long address = item.Item1; long size = item.Item2; - byte[] memory = debuggedProcess.ReadProcessMemory(address, size); + memory = debuggedProcess.ReadProcessMemory(address, size); if (memory == null) { - return string.Format(ResourceService.GetString("MainWindow.Windows.Debug.MemoryPad.UnableToReadFormat"), address.ToString("X8"), size); + console.Append(string.Format(ResourceService.GetString("MainWindow.Windows.Debug.MemoryPad.UnableToReadFormat"), address.ToString("X8"), size)); + return; } + ChangeByteDisplay(); + } + + public void ChangeByteDisplay() + { + if (memory == null || memory.Length == 0) + return; + + if (console == null) + return; + + console.Clear(); + addressesMapping.Clear(); + var item = memoryAddresses[currentAddressIndex]; + long address = item.Item1; + int totalBytesPerRow = columnsNumber * displayByteSize; int numberOfLines = memory.Length / totalBytesPerRow; int remainingMemory = memory.Length % totalBytesPerRow; + int currentLine = 2;// line in the console + int index = 0;// index in memory arrray of current line StringBuilder sb = new StringBuilder(); - sb.Append(string.Format( - ResourceService.GetString("MainWindow.Windows.Debug.MemoryPad.ReadingFromFormat"), - address.ToString("X8"), (address + memory.Length).ToString("X8"), memory.Length)); + sb.Append(string.Format(ResourceService.GetString("MainWindow.Windows.Debug.MemoryPad.ReadingFromFormat"), address.ToString("X8"), (address + memory.Length).ToString("X8"), memory.Length)); sb.Append(Environment.NewLine); - int currentLine = 2; // line in the console - int index = 0; // index in memory arrray of current line - while (index < numberOfLines) { addressesMapping.Add(address, currentLine); // write address - sb.Append(address.ToString("X8")); address += (long)totalBytesPerRow; + sb.Append(address.ToString("X8")); + address += (long)totalBytesPerRow; sb.Append(" "); - int start = index * totalBytesPerRow; // write bytes + int start = index * totalBytesPerRow; for (int i = 0; i < columnsNumber; ++i) { for (int j = 0; j < displayByteSize; ++j) { sb.Append(memory[start++].ToString("X2")); } sb.Append(" "); } + // write chars start = index * totalBytesPerRow; StringBuilder sb1 = new StringBuilder(); @@ -226,20 +237,18 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads sb1.Append(((char)memory[start++]).ToString()); } string s = sb1.ToString(); - s = Regex.Replace(s, @"\r\n", string.Empty); - s = Regex.Replace(s, @"\n", string.Empty); - s = Regex.Replace(s, @"\r", string.Empty); + s = Regex.Replace(s, "\\r\\n", string.Empty); + s = Regex.Replace(s, "\\n", string.Empty); + s = Regex.Replace(s, "\\r", string.Empty); sb.Append(s); sb.Append(Environment.NewLine); - currentLine++; index++; } + // write the rest of memory if (remainingMemory != 0) { - // write the rest of memory addressesMapping.Add(address, currentLine); - // write address sb.Append(address.ToString("X8")); sb.Append(" "); @@ -260,13 +269,13 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads sb1.Append(((char)memory[start++]).ToString()); } string s = sb1.ToString(); - s = Regex.Replace(s, @"\r\n", string.Empty); - s = Regex.Replace(s, @"\n", string.Empty); - s = Regex.Replace(s, @"\r", string.Empty); + s = Regex.Replace(s, "\\r\\n", string.Empty); + s = Regex.Replace(s, "\\n", string.Empty); + s = Regex.Replace(s, "\\r", string.Empty); sb.Append(s); } - return sb.ToString(); + console.Append(sb.ToString()); } public void MoveToPreviousAddress()