Make x86-64 stack walking work for Native Client minidumps
For NaCl, a stack walker should ignore the top 32 bits of %rip, %rsp and %rbp, otherwise it will try to read from %r15-extended stack addresses and look up symbol info for %r15-extended code addresses, which will fail. BUG=https://code.google.com/p/nativeclient/issues/detail?id=3424 TEST=tested manually with a NaCl minidump Review URL: https://breakpad.appspot.com/591002 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1173 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
85c352695f
commit
b45b97b2fd
@ -63,10 +63,11 @@ struct SystemInfo {
|
|||||||
string os;
|
string os;
|
||||||
|
|
||||||
// A short form of the os string, using lowercase letters and no spaces,
|
// A short form of the os string, using lowercase letters and no spaces,
|
||||||
// suitable for use in a filesystem. Possible values are "windows",
|
// suitable for use in a filesystem. Possible values include "windows",
|
||||||
// "mac", and "linux". Empty if the information is not present in the dump
|
// "mac", "linux" and "nacl". Empty if the information is not present
|
||||||
// or if the OS given by the dump is unknown. The values stored in this
|
// in the dump or if the OS given by the dump is unknown. The values
|
||||||
// field should match those used by MinidumpSystemInfo::GetOS.
|
// stored in this field should match those used by
|
||||||
|
// MinidumpSystemInfo::GetOS.
|
||||||
string os_short;
|
string os_short;
|
||||||
|
|
||||||
// A string identifying the version of the operating system, such as
|
// A string identifying the version of the operating system, such as
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "google_breakpad/processor/memory_region.h"
|
#include "google_breakpad/processor/memory_region.h"
|
||||||
#include "google_breakpad/processor/source_line_resolver_interface.h"
|
#include "google_breakpad/processor/source_line_resolver_interface.h"
|
||||||
#include "google_breakpad/processor/stack_frame_cpu.h"
|
#include "google_breakpad/processor/stack_frame_cpu.h"
|
||||||
|
#include "google_breakpad/processor/system_info.h"
|
||||||
#include "processor/cfi_frame_info.h"
|
#include "processor/cfi_frame_info.h"
|
||||||
#include "processor/logging.h"
|
#include "processor/logging.h"
|
||||||
#include "processor/stackwalker_amd64.h"
|
#include "processor/stackwalker_amd64.h"
|
||||||
@ -222,6 +223,16 @@ StackFrame* StackwalkerAMD64::GetCallerFrame(const CallStack* stack) {
|
|||||||
if (!new_frame.get())
|
if (!new_frame.get())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (system_info_->os_short == "nacl") {
|
||||||
|
// Apply constraints from Native Client's x86-64 sandbox. These
|
||||||
|
// registers have the 4GB-aligned sandbox base address (from r15)
|
||||||
|
// added to them, and only the bottom 32 bits are relevant for
|
||||||
|
// stack walking.
|
||||||
|
new_frame->context.rip = static_cast<uint32_t>(new_frame->context.rip);
|
||||||
|
new_frame->context.rsp = static_cast<uint32_t>(new_frame->context.rsp);
|
||||||
|
new_frame->context.rbp = static_cast<uint32_t>(new_frame->context.rbp);
|
||||||
|
}
|
||||||
|
|
||||||
// Treat an instruction address of 0 as end-of-stack.
|
// Treat an instruction address of 0 as end-of-stack.
|
||||||
if (new_frame->context.rip == 0)
|
if (new_frame->context.rip == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user