Add memory dumping helper to UiUtils.
- Adapted from KDL's db/dw et al.
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "UiUtils.h"
|
#include "UiUtils.h"
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <DateTime.h>
|
#include <DateTime.h>
|
||||||
@@ -18,6 +19,7 @@
|
|||||||
#include "Image.h"
|
#include "Image.h"
|
||||||
#include "StackFrame.h"
|
#include "StackFrame.h"
|
||||||
#include "Team.h"
|
#include "Team.h"
|
||||||
|
#include "TeamMemoryBlock.h"
|
||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
#include "Type.h"
|
#include "Type.h"
|
||||||
#include "Value.h"
|
#include "Value.h"
|
||||||
@@ -226,3 +228,63 @@ UiUtils::PrintValueNodeGraph(BString& _output, ValueNodeChild* child,
|
|||||||
|
|
||||||
return;
|
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");
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,13 +9,17 @@
|
|||||||
|
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
|
|
||||||
|
#include "Types.h"
|
||||||
|
|
||||||
|
|
||||||
class BString;
|
class BString;
|
||||||
class BVariant;
|
class BVariant;
|
||||||
class StackFrame;
|
class StackFrame;
|
||||||
class Team;
|
class Team;
|
||||||
|
class TeamMemoryBlock;
|
||||||
class ValueNodeChild;
|
class ValueNodeChild;
|
||||||
|
|
||||||
|
|
||||||
class UiUtils {
|
class UiUtils {
|
||||||
public:
|
public:
|
||||||
static const char* ThreadStateToString(int state,
|
static const char* ThreadStateToString(int state,
|
||||||
@@ -36,6 +40,11 @@ public:
|
|||||||
static void PrintValueNodeGraph(BString& _output,
|
static void PrintValueNodeGraph(BString& _output,
|
||||||
ValueNodeChild* child,
|
ValueNodeChild* child,
|
||||||
int32 indentLevel, int32 maxDepth);
|
int32 indentLevel, int32 maxDepth);
|
||||||
|
|
||||||
|
static void DumpMemory(BString& _output,
|
||||||
|
TeamMemoryBlock* block,
|
||||||
|
target_addr_t address, int32 itemSize,
|
||||||
|
int32 displayWidth, int32 count);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user