Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Unified Diff: src/client/linux/minidump_writer/linux_dumper.cc

Issue 543125: Port linux_syscall_support and linux_dumper to support Linux ARM. Unit tests... (Closed) Base URL: http://google-breakpad.googlecode.com/svn/trunk/
Patch Set: '' Created 10 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/client/linux/minidump_writer/linux_dumper.cc
===================================================================
--- src/client/linux/minidump_writer/linux_dumper.cc (revision 400)
+++ src/client/linux/minidump_writer/linux_dumper.cc (working copy)
@@ -80,7 +80,7 @@
LinuxDumper::LinuxDumper(int pid)
: pid_(pid),
- threads_suspened_(false),
+ threads_suspended_(false),
threads_(&allocator_, 8),
mappings_(&allocator_) {
}
@@ -91,22 +91,22 @@
}
bool LinuxDumper::ThreadsSuspend() {
- if (threads_suspened_)
+ if (threads_suspended_)
return true;
bool good = true;
for (size_t i = 0; i < threads_.size(); ++i)
good &= SuspendThread(threads_[i]);
- threads_suspened_ = true;
+ threads_suspended_ = true;
return good;
}
bool LinuxDumper::ThreadsResume() {
- if (!threads_suspened_)
+ if (!threads_suspended_)
return false;
bool good = true;
for (size_t i = 0; i < threads_.size(); ++i)
good &= ResumeThread(threads_[i]);
- threads_suspened_ = false;
+ threads_suspended_ = false;
return good;
}
@@ -280,9 +280,9 @@
}
// Read thread info from /proc/$pid/status.
-// Fill out the |tgid|, |ppid| and |pid| members of |info|. If unavailible,
+// Fill out the |tgid|, |ppid| and |pid| members of |info|. If unavailable,
// these members are set to -1. Returns true iff all three members are
-// availible.
+// available.
bool LinuxDumper::ThreadInfoGet(pid_t tid, ThreadInfo* info) {
assert(info != NULL);
char status_path[80];
@@ -337,6 +337,8 @@
memcpy(&stack_pointer, &info->regs.esp, sizeof(info->regs.esp));
#elif defined(__x86_64)
memcpy(&stack_pointer, &info->regs.rsp, sizeof(info->regs.rsp));
+#elif defined(__ARM_EABI__)
+ memcpy(&stack_pointer, &info->regs.uregs[R13], sizeof(info->regs.uregs[R13]));
#else
#error "This code hasn't been ported to your platform yet."
#endif
@@ -353,42 +355,31 @@
// unwind. So we just grab, up to, 32k of stack.
bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
uintptr_t int_stack_pointer) {
-#if defined(__i386) || defined(__x86_64)
- static const bool stack_grows_down = true;
- static const uintptr_t page_size = 4096;
-#else
-#error "This code has not been ported to your platform yet."
-#endif
// Move the stack pointer to the bottom of the page that it's in.
+ const uintptr_t page_size = getpagesize();
+
uint8_t* const stack_pointer =
reinterpret_cast<uint8_t*>(int_stack_pointer & ~(page_size - 1));
// The number of bytes of stack which we try to capture.
- static unsigned kStackToCapture = 32 * 1024;
+ static int kStackToCapture = 32 * 1024;
const MappingInfo* mapping = FindMapping(stack_pointer);
if (!mapping)
return false;
- if (stack_grows_down) {
- const ptrdiff_t offset = stack_pointer - (uint8_t*) mapping->start_addr;
- const ptrdiff_t distance_to_end =
- static_cast<ptrdiff_t>(mapping->size) - offset;
- *stack_len = distance_to_end > kStackToCapture ?
- kStackToCapture : distance_to_end;
- *stack = stack_pointer;
- } else {
- const ptrdiff_t offset = stack_pointer - (uint8_t*) mapping->start_addr;
- *stack_len = offset > kStackToCapture ? kStackToCapture : offset;
- *stack = stack_pointer - *stack_len;
- }
-
+ const ptrdiff_t offset = stack_pointer - (uint8_t*) mapping->start_addr;
awong 2010/02/08 20:52:55 so...we're assuming a single stack direction now?
+ const ptrdiff_t distance_to_end =
+ static_cast<ptrdiff_t>(mapping->size) - offset;
+ *stack_len = distance_to_end > kStackToCapture ?
+ kStackToCapture : distance_to_end;
+ *stack = stack_pointer;
return true;
}
// static
void LinuxDumper::CopyFromProcess(void* dest, pid_t child, const void* src,
size_t length) {
- unsigned long tmp;
+ unsigned long tmp = 55;
awong 2010/02/08 20:52:55 Magic number alert! What's this number for?
size_t done = 0;
static const size_t word_size = sizeof(tmp);
uint8_t* const local = (uint8_t*) dest;
@@ -396,8 +387,9 @@
while (done < length) {
const size_t l = length - done > word_size ? word_size : length - done;
- if (sys_ptrace(PTRACE_PEEKDATA, child, remote + done, &tmp) == -1)
+ if (sys_ptrace(PTRACE_PEEKDATA, child, remote + done, &tmp) == -1) {
tmp = 0;
+ }
memcpy(local + done, &tmp, l);
done += l;
}

Powered by Google App Engine
This is Rietveld 408576698