mirror of
https://github.com/yuzu-emu/breakpad.git
synced 2024-12-23 17:35:33 +00:00
Fix printing of x86_64 registers from minidump_stackwalk
R=mark at http://breakpad.appspot.com/262001 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@772 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
0afda6b2c2
commit
1530800640
|
@ -78,18 +78,37 @@ static const char kOutputSeparator = '|';
|
||||||
|
|
||||||
// PrintRegister prints a register's name and value to stdout. It will
|
// PrintRegister prints a register's name and value to stdout. It will
|
||||||
// print four registers on a line. For the first register in a set,
|
// print four registers on a line. For the first register in a set,
|
||||||
// pass 0 for |sequence|. For registers in a set, pass the most recent
|
// pass 0 for |start_col|. For registers in a set, pass the most recent
|
||||||
// return value of PrintRegister. Note that PrintRegister will print a
|
// return value of PrintRegister.
|
||||||
// newline before the first register (with |sequence| set to 0) is printed.
|
|
||||||
// The caller is responsible for printing the final newline after a set
|
// The caller is responsible for printing the final newline after a set
|
||||||
// of registers is completely printed, regardless of the number of calls
|
// of registers is completely printed, regardless of the number of calls
|
||||||
// to PrintRegister.
|
// to PrintRegister.
|
||||||
static int PrintRegister(const char *name, u_int32_t value, int sequence) {
|
static const int kMaxWidth = 80; // optimize for an 80-column terminal
|
||||||
if (sequence % 4 == 0) {
|
static int PrintRegister(const char *name, u_int32_t value, int start_col) {
|
||||||
|
char buffer[64];
|
||||||
|
snprintf(buffer, sizeof(buffer), " %5s = 0x%08x", name, value);
|
||||||
|
|
||||||
|
if (start_col + strlen(buffer) > kMaxWidth) {
|
||||||
|
start_col = 0;
|
||||||
printf("\n ");
|
printf("\n ");
|
||||||
}
|
}
|
||||||
printf(" %5s = 0x%08x", name, value);
|
fputs(buffer, stdout);
|
||||||
return ++sequence;
|
|
||||||
|
return start_col + strlen(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// PrintRegister64 does the same thing, but for 64-bit registers.
|
||||||
|
static int PrintRegister64(const char *name, u_int64_t value, int start_col) {
|
||||||
|
char buffer[64];
|
||||||
|
snprintf(buffer, sizeof(buffer), " %5s = 0x%016" PRIx64 , name, value);
|
||||||
|
|
||||||
|
if (start_col + strlen(buffer) > kMaxWidth) {
|
||||||
|
start_col = 0;
|
||||||
|
printf("\n ");
|
||||||
|
}
|
||||||
|
fputs(buffer, stdout);
|
||||||
|
|
||||||
|
return start_col + strlen(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// StripSeparator takes a string |original| and returns a copy
|
// StripSeparator takes a string |original| and returns a copy
|
||||||
|
@ -142,6 +161,7 @@ static void PrintStack(const CallStack *stack, const string &cpu) {
|
||||||
} else {
|
} else {
|
||||||
printf("0x%" PRIx64, frame->instruction);
|
printf("0x%" PRIx64, frame->instruction);
|
||||||
}
|
}
|
||||||
|
printf("\n ");
|
||||||
|
|
||||||
int sequence = 0;
|
int sequence = 0;
|
||||||
if (cpu == "x86") {
|
if (cpu == "x86") {
|
||||||
|
@ -179,21 +199,21 @@ static void PrintStack(const CallStack *stack, const string &cpu) {
|
||||||
reinterpret_cast<const StackFrameAMD64*>(frame);
|
reinterpret_cast<const StackFrameAMD64*>(frame);
|
||||||
|
|
||||||
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBX)
|
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBX)
|
||||||
sequence = PrintRegister("rbx", frame_amd64->context.rbx, sequence);
|
sequence = PrintRegister64("rbx", frame_amd64->context.rbx, sequence);
|
||||||
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R12)
|
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R12)
|
||||||
sequence = PrintRegister("r12", frame_amd64->context.r12, sequence);
|
sequence = PrintRegister64("r12", frame_amd64->context.r12, sequence);
|
||||||
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R13)
|
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R13)
|
||||||
sequence = PrintRegister("r13", frame_amd64->context.r13, sequence);
|
sequence = PrintRegister64("r13", frame_amd64->context.r13, sequence);
|
||||||
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R14)
|
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R14)
|
||||||
sequence = PrintRegister("r14", frame_amd64->context.r14, sequence);
|
sequence = PrintRegister64("r14", frame_amd64->context.r14, sequence);
|
||||||
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R15)
|
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R15)
|
||||||
sequence = PrintRegister("r15", frame_amd64->context.r15, sequence);
|
sequence = PrintRegister64("r15", frame_amd64->context.r15, sequence);
|
||||||
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RIP)
|
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RIP)
|
||||||
sequence = PrintRegister("rip", frame_amd64->context.rip, sequence);
|
sequence = PrintRegister64("rip", frame_amd64->context.rip, sequence);
|
||||||
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RSP)
|
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RSP)
|
||||||
sequence = PrintRegister("rsp", frame_amd64->context.rsp, sequence);
|
sequence = PrintRegister64("rsp", frame_amd64->context.rsp, sequence);
|
||||||
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBP)
|
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBP)
|
||||||
sequence = PrintRegister("rbp", frame_amd64->context.rbp, sequence);
|
sequence = PrintRegister64("rbp", frame_amd64->context.rbp, sequence);
|
||||||
} else if (cpu == "sparc") {
|
} else if (cpu == "sparc") {
|
||||||
const StackFrameSPARC *frame_sparc =
|
const StackFrameSPARC *frame_sparc =
|
||||||
reinterpret_cast<const StackFrameSPARC*>(frame);
|
reinterpret_cast<const StackFrameSPARC*>(frame);
|
||||||
|
|
Loading…
Reference in a new issue