diff --git a/src/apps/debugger/user_interface/util/UiUtils.cpp b/src/apps/debugger/user_interface/util/UiUtils.cpp index d44f46a8ff..28418222a9 100644 --- a/src/apps/debugger/user_interface/util/UiUtils.cpp +++ b/src/apps/debugger/user_interface/util/UiUtils.cpp @@ -7,6 +7,7 @@ #include "UiUtils.h" +#include #include #include @@ -18,6 +19,7 @@ #include "Image.h" #include "StackFrame.h" #include "Team.h" +#include "TeamMemoryBlock.h" #include "Thread.h" #include "Type.h" #include "Value.h" @@ -226,3 +228,63 @@ UiUtils::PrintValueNodeGraph(BString& _output, ValueNodeChild* child, return; } + + +/*static*/ void UiUtils::DumpMemory(BString& _output, TeamMemoryBlock* block, + target_addr_t address, int32 itemSize, int32 displayWidth, int32 count) +{ + BString data; + + int32 j; + for (int32 i = 0; i < count; i++) { + uint8* value; + + if ((i % displayWidth) == 0) { + int32 displayed = min_c(displayWidth, (count-i)) * itemSize; + if (i != 0) + _output.Append("\n"); + + data.SetToFormat("[%#" B_PRIx64 "] ", address + i * itemSize); + _output += data; + char c; + for (j = 0; j < displayed; j++) { + if (!block->Contains(address + displayed)) + break; + c = *(block->Data() + address - block->BaseAddress() + + (i * itemSize) + j); + if (!isprint(c)) + c = '.'; + + _output += c; + } + if (count > displayWidth) { + // make sure the spacing in the last line is correct + for (j = displayed; j < displayWidth * itemSize; j++) + _output += ' '; + } + _output.Append(" "); + } + + value = block->Data() + address - block->BaseAddress() + + i * itemSize; + + switch (itemSize) { + case 1: + data.SetToFormat(" %02" B_PRIx8, *(uint8*)value); + break; + case 2: + data.SetToFormat(" %04" B_PRIx16, *(uint16*)value); + break; + case 4: + data.SetToFormat(" %08" B_PRIx32, *(uint32*)value); + break; + case 8: + data.SetToFormat(" %016" B_PRIx64, *(uint64*)value); + break; + } + + _output += data; + } + + _output.Append("\n"); +} diff --git a/src/apps/debugger/user_interface/util/UiUtils.h b/src/apps/debugger/user_interface/util/UiUtils.h index 437b34c864..cffb70043e 100644 --- a/src/apps/debugger/user_interface/util/UiUtils.h +++ b/src/apps/debugger/user_interface/util/UiUtils.h @@ -9,13 +9,17 @@ #include +#include "Types.h" + class BString; class BVariant; class StackFrame; class Team; +class TeamMemoryBlock; class ValueNodeChild; + class UiUtils { public: static const char* ThreadStateToString(int state, @@ -36,6 +40,11 @@ public: static void PrintValueNodeGraph(BString& _output, ValueNodeChild* child, int32 indentLevel, int32 maxDepth); + + static void DumpMemory(BString& _output, + TeamMemoryBlock* block, + target_addr_t address, int32 itemSize, + int32 displayWidth, int32 count); };