aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am51
-rw-r--r--Makefile.in83
-rw-r--r--src/google_breakpad/processor/microdump.h122
-rw-r--r--src/google_breakpad/processor/microdump_processor.h3
-rw-r--r--src/google_breakpad/processor/process_state.h4
-rw-r--r--src/processor/basic_code_modules.cc5
-rw-r--r--src/processor/basic_code_modules.h5
-rw-r--r--src/processor/microdump.cc262
-rw-r--r--src/processor/microdump_processor.cc42
-rw-r--r--src/processor/microdump_processor_unittest.cc138
-rw-r--r--src/processor/testdata/microdump.dmp157
-rw-r--r--src/processor/testdata/symbols/microdump/libchromeshell.so/76304586D0CD2C8FF899C602BF1756A20/libchromeshell.so.sym249
12 files changed, 1091 insertions, 30 deletions
diff --git a/Makefile.am b/Makefile.am
index 1e3279ff..15c53bf6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -168,7 +168,8 @@ src_libbreakpad_a_SOURCES = \
src/google_breakpad/processor/exploitability.h \
src/google_breakpad/processor/fast_source_line_resolver.h \
src/google_breakpad/processor/memory_region.h \
- src/google_breakpad/processor/microdump_processor.h \
+ src/google_breakpad/processor/microdump.h \
+ src/google_breakpad/processor/microdump_processor.h \
src/google_breakpad/processor/minidump.h \
src/google_breakpad/processor/minidump_processor.h \
src/google_breakpad/processor/process_result.h \
@@ -211,7 +212,8 @@ src_libbreakpad_a_SOURCES = \
src/processor/logging.cc \
src/processor/map_serializers-inl.h \
src/processor/map_serializers.h \
- src/processor/microdump_processor.cc \
+ src/processor/microdump.cc \
+ src/processor/microdump_processor.cc \
src/processor/minidump.cc \
src/processor/minidump_processor.cc \
src/processor/module_comparer.cc \
@@ -331,7 +333,7 @@ check_PROGRAMS += \
src/processor/exploitability_unittest \
src/processor/fast_source_line_resolver_unittest \
src/processor/map_serializers_unittest \
- src/processor/microdump_processor_unittest \
+ src/processor/microdump_processor_unittest \
src/processor/minidump_processor_unittest \
src/processor/minidump_unittest \
src/processor/static_address_map_unittest \
@@ -771,17 +773,42 @@ src_processor_map_serializers_unittest_LDADD = \
$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
src_processor_microdump_processor_unittest_SOURCES = \
- src/processor/microdump_processor_unittest.cc \
- src/testing/gtest/src/gtest-all.cc \
- src/testing/src/gmock-all.cc
+ src/processor/microdump_processor_unittest.cc \
+ src/testing/gtest/src/gtest-all.cc \
+ src/testing/src/gmock-all.cc
src_processor_microdump_processor_unittest_CPPFLAGS = \
- -I$(top_srcdir)/src \
- -I$(top_srcdir)/src/testing/include \
- -I$(top_srcdir)/src/testing/gtest/include \
- -I$(top_srcdir)/src/testing/gtest \
- -I$(top_srcdir)/src/testing
+ -I$(top_srcdir)/src \
+ -I$(top_srcdir)/src/testing/include \
+ -I$(top_srcdir)/src/testing/gtest/include \
+ -I$(top_srcdir)/src/testing/gtest \
+ -I$(top_srcdir)/src/testing
src_processor_microdump_processor_unittest_LDADD = \
- $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
+ src/processor/basic_code_modules.o \
+ src/processor/basic_source_line_resolver.o \
+ src/processor/call_stack.o \
+ src/processor/cfi_frame_info.o \
+ src/processor/dump_context.o \
+ src/processor/dump_object.o \
+ src/processor/logging.o \
+ src/processor/microdump.o \
+ src/processor/microdump_processor.o \
+ src/processor/pathname_stripper.o \
+ src/processor/process_state.o \
+ src/processor/simple_symbol_supplier.o \
+ src/processor/source_line_resolver_base.o \
+ src/processor/stack_frame_symbolizer.o \
+ src/processor/stackwalker.o \
+ src/processor/stackwalker_amd64.o \
+ src/processor/stackwalker_arm.o \
+ src/processor/stackwalker_arm64.o \
+ src/processor/stackwalker_address_list.o \
+ src/processor/stackwalker_mips.o \
+ src/processor/stackwalker_ppc.o \
+ src/processor/stackwalker_ppc64.o \
+ src/processor/stackwalker_sparc.o \
+ src/processor/stackwalker_x86.o \
+ src/processor/tokenize.o \
+ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
src_processor_minidump_processor_unittest_SOURCES = \
src/processor/minidump_processor_unittest.cc \
diff --git a/Makefile.in b/Makefile.in
index d15881f1..0305745a 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -169,7 +169,7 @@ check_PROGRAMS = $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers_unittest \
-@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor_unittest \
+@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map_unittest \
@@ -342,6 +342,7 @@ am__src_libbreakpad_a_SOURCES_DIST = \
src/google_breakpad/processor/exploitability.h \
src/google_breakpad/processor/fast_source_line_resolver.h \
src/google_breakpad/processor/memory_region.h \
+ src/google_breakpad/processor/microdump.h \
src/google_breakpad/processor/microdump_processor.h \
src/google_breakpad/processor/minidump.h \
src/google_breakpad/processor/minidump_processor.h \
@@ -378,7 +379,7 @@ am__src_libbreakpad_a_SOURCES_DIST = \
src/processor/fast_source_line_resolver.cc \
src/processor/linked_ptr.h src/processor/logging.h \
src/processor/logging.cc src/processor/map_serializers-inl.h \
- src/processor/map_serializers.h \
+ src/processor/map_serializers.h src/processor/microdump.cc \
src/processor/microdump_processor.cc src/processor/minidump.cc \
src/processor/minidump_processor.cc \
src/processor/module_comparer.cc \
@@ -442,6 +443,7 @@ am__src_libbreakpad_a_SOURCES_DIST = \
@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.$(OBJEXT) \
+@DISABLE_PROCESSOR_FALSE@ src/processor/microdump.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.$(OBJEXT) \
@@ -899,6 +901,31 @@ am__src_processor_microdump_processor_unittest_SOURCES_DIST = \
src_processor_microdump_processor_unittest_OBJECTS = \
$(am_src_processor_microdump_processor_unittest_OBJECTS)
@DISABLE_PROCESSOR_FALSE@src_processor_microdump_processor_unittest_DEPENDENCIES = \
+@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/microdump.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \
@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1)
am__src_processor_minidump_dump_SOURCES_DIST = \
@@ -1888,7 +1915,8 @@ lib_LIBRARIES = $(am__append_5) $(am__append_8)
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/exploitability.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/fast_source_line_resolver.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/memory_region.h \
-@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/microdump_processor.h \
+@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/microdump.h \
+@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/microdump_processor.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/minidump.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/minidump_processor.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/process_result.h \
@@ -1931,7 +1959,8 @@ lib_LIBRARIES = $(am__append_5) $(am__append_8)
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers-inl.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers.h \
-@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.cc \
+@DISABLE_PROCESSOR_FALSE@ src/processor/microdump.cc \
+@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/module_comparer.cc \
@@ -2405,19 +2434,44 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
@DISABLE_PROCESSOR_FALSE@src_processor_microdump_processor_unittest_SOURCES = \
-@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor_unittest.cc \
-@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
-@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
+@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor_unittest.cc \
+@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
+@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
@DISABLE_PROCESSOR_FALSE@src_processor_microdump_processor_unittest_CPPFLAGS = \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
-@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
+@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@DISABLE_PROCESSOR_FALSE@src_processor_microdump_processor_unittest_LDADD = \
-@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
+@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/microdump.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \
+@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
+@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
@DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_SOURCES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest.cc \
@@ -3199,6 +3253,8 @@ src/processor/fast_source_line_resolver.$(OBJEXT): \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/logging.$(OBJEXT): src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
+src/processor/microdump.$(OBJEXT): src/processor/$(am__dirstamp) \
+ src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/microdump_processor.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
@@ -4313,6 +4369,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/exploitability_win.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/fast_source_line_resolver.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/logging.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/microdump.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/microdump_processor.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_dump.Po@am__quote@
diff --git a/src/google_breakpad/processor/microdump.h b/src/google_breakpad/processor/microdump.h
new file mode 100644
index 00000000..3676bd67
--- /dev/null
+++ b/src/google_breakpad/processor/microdump.h
@@ -0,0 +1,122 @@
+// Copyright (c) 2014 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// microdump.h: A microdump reader. Microdump is a minified variant of a
+// minidump (see minidump.h for documentation) which contains the minimum
+// amount of information required to get a stack trace for the crashing thread.
+// The information contained in a microdump is:
+// - the crashing thread stack
+// - system information (os type / version)
+// - cpu context (state of the registers)
+// - list of mmaps
+
+#ifndef GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_H__
+#define GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_H__
+
+#include <string>
+#include <vector>
+
+#include "common/scoped_ptr.h"
+#include "common/using_std_string.h"
+#include "google_breakpad/processor/dump_context.h"
+#include "google_breakpad/processor/memory_region.h"
+#include "processor/basic_code_modules.h"
+
+namespace google_breakpad {
+
+// MicrodumpModuleList contains all of the loaded code modules for a process
+// in the form of MicrodumpModules. It maintains a vector of these modules
+// and provides access to a code module corresponding to a specific address.
+class MicrodumpModules : public BasicCodeModules {
+ public:
+ // Takes over ownership of |module|.
+ void Add(const CodeModule* module);
+};
+
+// MicrodumpContext carries a CPU-specific context.
+// See dump_context.h for documentation.
+class MicrodumpContext : public DumpContext {
+ public:
+ virtual void SetContextARM(MDRawContextARM* arm);
+};
+
+// This class provides access to microdump memory regions.
+// See memory_region.h for documentation.
+class MicrodumpMemoryRegion : public MemoryRegion {
+ public:
+ MicrodumpMemoryRegion();
+ virtual ~MicrodumpMemoryRegion() {}
+
+ // Set this region's address and contents. If we have placed an
+ // instance of this class in a test fixture class, individual tests
+ // can use this to provide the region's contents.
+ void Init(uint64_t base_address, const std::vector<uint8_t>& contents);
+
+ virtual uint64_t GetBase() const;
+ virtual uint32_t GetSize() const;
+
+ virtual bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const;
+ virtual bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const;
+ virtual bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const;
+ virtual bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const;
+
+ // Print a human-readable representation of the object to stdout.
+ virtual void Print() const;
+
+ private:
+ // Fetch a little-endian value from ADDRESS in contents_ whose size
+ // is BYTES, and store it in *VALUE. Returns true on success.
+ template<typename ValueType>
+ bool GetMemoryLittleEndian(uint64_t address, ValueType* value) const;
+
+ uint64_t base_address_;
+ std::vector<uint8_t> contents_;
+};
+
+// Microdump is the user's interface to a microdump file. It provides access to
+// the microdump's context, memory regions and modules.
+class Microdump {
+ public:
+ explicit Microdump(const string& contents);
+ virtual ~Microdump() {}
+
+ DumpContext* GetContext() { return context_.get(); }
+ MicrodumpMemoryRegion* GetMemory() { return stack_region_.get(); }
+ MicrodumpModules* GetModules() { return modules_.get(); }
+
+ private:
+ scoped_ptr<MicrodumpContext> context_;
+ scoped_ptr<MicrodumpMemoryRegion> stack_region_;
+ scoped_ptr<MicrodumpModules> modules_;
+};
+
+} // namespace google_breakpad
+
+#endif // GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_H__
+
diff --git a/src/google_breakpad/processor/microdump_processor.h b/src/google_breakpad/processor/microdump_processor.h
index 6ba6221d..1322a01c 100644
--- a/src/google_breakpad/processor/microdump_processor.h
+++ b/src/google_breakpad/processor/microdump_processor.h
@@ -27,6 +27,9 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// The processor for microdump (a reduced dump containing only the state of the
+// crashing thread). See crbug.com/410294 for more info and design docs.
+
#ifndef GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_PROCESSOR_H__
#define GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_PROCESSOR_H__
diff --git a/src/google_breakpad/processor/process_state.h b/src/google_breakpad/processor/process_state.h
index 88f826c2..a33b2123 100644
--- a/src/google_breakpad/processor/process_state.h
+++ b/src/google_breakpad/processor/process_state.h
@@ -117,8 +117,10 @@ class ProcessState {
ExploitabilityRating exploitability() const { return exploitability_; }
private:
- // MinidumpProcessor is responsible for building ProcessState objects.
+ // MinidumpProcessor and MicrodumpProcessor are responsible for building
+ // ProcessState objects.
friend class MinidumpProcessor;
+ friend class MicrodumpProcessor;
// The time-date stamp of the minidump (time_t format)
uint32_t time_date_stamp_;
diff --git a/src/processor/basic_code_modules.cc b/src/processor/basic_code_modules.cc
index 588140c8..40b45a8b 100644
--- a/src/processor/basic_code_modules.cc
+++ b/src/processor/basic_code_modules.cc
@@ -73,6 +73,11 @@ BasicCodeModules::BasicCodeModules(const CodeModules *that)
}
}
+BasicCodeModules::BasicCodeModules()
+ : main_address_(0),
+ map_(new RangeMap<uint64_t, linked_ptr<const CodeModule> >()) {
+}
+
BasicCodeModules::~BasicCodeModules() {
delete map_;
}
diff --git a/src/processor/basic_code_modules.h b/src/processor/basic_code_modules.h
index d302287e..ace569b8 100644
--- a/src/processor/basic_code_modules.h
+++ b/src/processor/basic_code_modules.h
@@ -67,7 +67,9 @@ class BasicCodeModules : public CodeModules {
virtual const CodeModule* GetModuleAtIndex(unsigned int index) const;
virtual const CodeModules* Copy() const;
- private:
+ protected:
+ BasicCodeModules();
+
// The base address of the main module.
uint64_t main_address_;
@@ -75,6 +77,7 @@ class BasicCodeModules : public CodeModules {
// address range.
RangeMap<uint64_t, linked_ptr<const CodeModule> > *map_;
+ private:
// Disallow copy constructor and assignment operator.
BasicCodeModules(const BasicCodeModules &that);
void operator=(const BasicCodeModules &that);
diff --git a/src/processor/microdump.cc b/src/processor/microdump.cc
new file mode 100644
index 00000000..3e45d175
--- /dev/null
+++ b/src/processor/microdump.cc
@@ -0,0 +1,262 @@
+// Copyright (c) 2014 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// microdump.cc: A microdump reader.
+//
+// See microdump.h for documentation.
+
+#include "google_breakpad/processor/microdump.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include <memory>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "google_breakpad/common/minidump_cpu_arm.h"
+#include "google_breakpad/processor/code_module.h"
+#include "processor/basic_code_module.h"
+#include "processor/linked_ptr.h"
+#include "processor/logging.h"
+#include "processor/range_map-inl.h"
+
+namespace {
+static const char kGoogleBreakpadKey[] = "/google-breakpad(";
+static const char kMicrodumpBegin[] = "-----BEGIN BREAKPAD MICRODUMP-----";
+static const char kMicrodumpEnd[] = "-----END BREAKPAD MICRODUMP-----";
+static const char kOsKey[] = ": O ";
+static const char kCpuKey[] = ": C ";
+static const char kMmapKey[] = ": M ";
+static const char kStackKey[] = ": S ";
+static const char kStackFirstLineKey[] = ": S 0 ";
+static const char kArmArchitecture[] = "armv7l";
+
+template<typename T>
+T HexStrToL(const string& str) {
+ uint64_t res = 0;
+ std::istringstream ss(str);
+ ss >> std::hex >> res;
+ return static_cast<T>(res);
+}
+
+std::vector<uint8_t> ParseHexBuf(const string& str) {
+ std::vector<uint8_t> buf;
+ for (size_t i = 0; i < str.length(); i += 2) {
+ buf.push_back(HexStrToL<uint8_t>(str.substr(i, 2)));
+ }
+ return buf;
+}
+
+} // namespace
+
+namespace google_breakpad {
+
+//
+// MicrodumpModules
+//
+
+void MicrodumpModules::Add(const CodeModule* module) {
+ linked_ptr<const CodeModule> module_ptr(module);
+ if (!map_->StoreRange(module->base_address(), module->size(), module_ptr)) {
+ BPLOG(ERROR) << "Module " << module->code_file() <<
+ " could not be stored";
+ }
+}
+
+
+//
+// MicrodumpContext
+//
+
+void MicrodumpContext::SetContextARM(MDRawContextARM* arm) {
+ DumpContext::SetContextFlags(MD_CONTEXT_ARM);
+ DumpContext::SetContextARM(arm);
+ valid_ = true;
+}
+
+
+//
+// MicrodumpMemoryRegion
+//
+
+MicrodumpMemoryRegion::MicrodumpMemoryRegion() : base_address_(0) { }
+
+void MicrodumpMemoryRegion::Init(uint64_t base_address,
+ const std::vector<uint8_t>& contents) {
+ base_address_ = base_address;
+ contents_ = contents;
+}
+
+uint64_t MicrodumpMemoryRegion::GetBase() const { return base_address_; }
+
+uint32_t MicrodumpMemoryRegion::GetSize() const { return contents_.size(); }
+
+bool MicrodumpMemoryRegion::GetMemoryAtAddress(uint64_t address,
+ uint8_t* value) const {
+ return GetMemoryLittleEndian(address, value);
+}
+
+bool MicrodumpMemoryRegion::GetMemoryAtAddress(uint64_t address,
+ uint16_t* value) const {
+ return GetMemoryLittleEndian(address, value);
+}
+
+bool MicrodumpMemoryRegion::GetMemoryAtAddress(uint64_t address,
+ uint32_t* value) const {
+ return GetMemoryLittleEndian(address, value);
+}
+
+bool MicrodumpMemoryRegion::GetMemoryAtAddress(uint64_t address,
+ uint64_t* value) const {
+ return GetMemoryLittleEndian(address, value);
+}
+
+template<typename ValueType>
+bool MicrodumpMemoryRegion::GetMemoryLittleEndian(uint64_t address,
+ ValueType* value) const {
+ if (address < base_address_ ||
+ address - base_address_ + sizeof(ValueType) > contents_.size())
+ return false;
+ ValueType v = 0;
+ uint64_t start = address - base_address_;
+ // The loop condition is odd, but it's correct for size_t.
+ for (size_t i = sizeof(ValueType) - 1; i < sizeof(ValueType); i--)
+ v = (v << 8) | static_cast<uint8_t>(contents_[start + i]);
+ *value = v;
+ return true;
+}
+
+void MicrodumpMemoryRegion::Print() const {
+ // Not reached, just needed to honor the base class contract.
+ assert(false);
+}
+
+//
+// Microdump
+//
+Microdump::Microdump(const string& contents)
+ : context_(new MicrodumpContext()),
+ stack_region_(new MicrodumpMemoryRegion()),
+ modules_(new MicrodumpModules()) {
+ assert(!contents.empty());
+
+ bool in_microdump = false;
+ string line;
+ uint64_t stack_start = 0;
+ std::vector<uint8_t> stack_content;
+ string arch;
+
+ std::istringstream stream(contents);
+ while (std::getline(stream, line)) {
+ if (line.find(kGoogleBreakpadKey) == string::npos) {
+ continue;
+ }
+ if (line.find(kMicrodumpBegin) != string::npos) {
+ in_microdump = true;
+ continue;
+ }
+ if (line.find(kMicrodumpEnd) != string::npos) {
+ break;
+ }
+
+ if (!in_microdump) {
+ continue;
+ }
+
+ size_t pos;
+ if ((pos = line.find(kOsKey)) != string::npos) {
+ string os_str(line, pos + strlen(kOsKey));
+ std::istringstream os_tokens(os_str);
+ string unused_id;
+ os_tokens >> unused_id;
+ os_tokens >> arch;
+ arch = arch.substr(1, arch.length() - 2); // remove quotes
+ // OS line also contains release and version for future use.
+ } else if ((pos = line.find(kStackKey)) != string::npos) {
+ if (line.find(kStackFirstLineKey) != string::npos) {
+ // The first line of the stack (S 0 stack header) provides the value of
+ // the stack pointer, the start address of the stack being dumped and
+ // the length of the stack. We could use it in future to double check
+ // that we received all the stack as expected.
+ continue;
+ }
+ string stack_str(line, pos + strlen(kStackKey));
+ std::istringstream stack_tokens(stack_str);
+ string start_addr_str;
+ string raw_content;
+ stack_tokens >> start_addr_str;
+ stack_tokens >> raw_content;
+ uint64_t start_addr = HexStrToL<uint64_t>(start_addr_str);
+
+ if (stack_start != 0) {
+ // Verify that the stack chunks in the microdump are contiguous.
+ assert(start_addr == stack_start + stack_content.size());
+ } else {
+ stack_start = start_addr;
+ }
+ std::vector<uint8_t> chunk = ParseHexBuf(raw_content);
+ stack_content.insert(stack_content.end(), chunk.begin(), chunk.end());
+
+ } else if ((pos = line.find(kCpuKey)) != string::npos) {
+ string cpu_state_str(line, pos + strlen(kCpuKey));
+ std::vector<uint8_t> cpu_state_raw = ParseHexBuf(cpu_state_str);
+ if (strcmp(arch.c_str(), kArmArchitecture) == 0) {
+ MDRawContextARM* arm = new MDRawContextARM();
+ memcpy(arm, &cpu_state_raw[0], cpu_state_raw.size());
+ context_->SetContextARM(arm);
+ } else {
+ std::cerr << "Unsupported architecture: " << arch << std::endl;
+ }
+ } else if ((pos = line.find(kMmapKey)) != string::npos) {
+ string mmap_line(line, pos + strlen(kMmapKey));
+ std::istringstream mmap_tokens(mmap_line);
+ string addr, offset, size, identifier, filename;
+ mmap_tokens >> addr;
+ mmap_tokens >> offset;
+ mmap_tokens >> size;
+ mmap_tokens >> identifier;
+ mmap_tokens >> filename;
+
+ modules_->Add(new BasicCodeModule(
+ HexStrToL<uint64_t>(addr), // base_address
+ HexStrToL<uint64_t>(size), // size
+ filename, // code_file
+ identifier, // code_identifier
+ filename, // debug_file
+ identifier, // debug_identifier
+ "")); // version
+ }
+ }
+ stack_region_->Init(stack_start, stack_content);
+}
+
+} // namespace google_breakpad
+
diff --git a/src/processor/microdump_processor.cc b/src/processor/microdump_processor.cc
index c9229525..40b3688e 100644
--- a/src/processor/microdump_processor.cc
+++ b/src/processor/microdump_processor.cc
@@ -27,6 +27,10 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// microdump_processor.cc: A microdump processor.
+//
+// See microdump_processor.h for documentation.
+
#include "google_breakpad/processor/microdump_processor.h"
#include <assert.h>
@@ -35,8 +39,11 @@
#include "common/using_std_string.h"
#include "google_breakpad/processor/call_stack.h"
+#include "google_breakpad/processor/microdump.h"
#include "google_breakpad/processor/process_state.h"
+#include "google_breakpad/processor/stackwalker.h"
#include "google_breakpad/processor/stack_frame_symbolizer.h"
+#include "processor/logging.h"
namespace google_breakpad {
@@ -51,7 +58,40 @@ ProcessResult MicrodumpProcessor::Process(const string &microdump_contents,
ProcessState* process_state) {
assert(process_state);
- // TODO(mmandlis): Implement MicrodumpProcessor. See crbug.com/410294
+ process_state->Clear();
+
+ if (microdump_contents.empty()) {
+ BPLOG(ERROR) << "Microdump is empty.";
+ return PROCESS_ERROR_MINIDUMP_NOT_FOUND;
+ }
+
+ Microdump microdump(microdump_contents);
+ process_state->modules_ = microdump.GetModules()->Copy();
+ scoped_ptr<Stackwalker> stackwalker(
+ Stackwalker::StackwalkerForCPU(
+ &process_state->system_info_,
+ microdump.GetContext(),
+ microdump.GetMemory(),
+ process_state->modules_,
+ frame_symbolizer_));
+
+ scoped_ptr<CallStack> stack(new CallStack());
+ if (stackwalker.get()) {
+ if (!stackwalker->Walk(stack.get(),
+ &process_state->modules_without_symbols_,
+ &process_state->modules_with_corrupt_symbols_)) {
+ BPLOG(INFO) << "Processing was interrupted.";
+ return PROCESS_SYMBOL_SUPPLIER_INTERRUPTED;
+ }
+ } else {
+ BPLOG(ERROR) << "No stackwalker found for microdump.";
+ return PROCESS_ERROR_NO_THREAD_LIST;
+ }
+
+ process_state->threads_.push_back(stack.release());
+ process_state->thread_memory_regions_.push_back(microdump.GetMemory());
+ process_state->crashed_ = true;
+ process_state->requesting_thread_ = 0;
return PROCESS_OK;
}
diff --git a/src/processor/microdump_processor_unittest.cc b/src/processor/microdump_processor_unittest.cc
index 45e534ab..9353383c 100644
--- a/src/processor/microdump_processor_unittest.cc
+++ b/src/processor/microdump_processor_unittest.cc
@@ -29,18 +29,152 @@
// Unit test for MicrodumpProcessor.
+#include <fstream>
+#include <iostream>
+#include <string>
+#include <vector>
+
#include "breakpad_googletest_includes.h"
+#include "google_breakpad/processor/basic_source_line_resolver.h"
+#include "google_breakpad/processor/call_stack.h"
+#include "google_breakpad/processor/microdump_processor.h"
+#include "google_breakpad/processor/process_state.h"
+#include "google_breakpad/processor/stack_frame.h"
+#include "google_breakpad/processor/stack_frame_symbolizer.h"
+#include "processor/simple_symbol_supplier.h"
+#include "processor/stackwalker_unittest_utils.h"
namespace {
+using google_breakpad::BasicSourceLineResolver;
+using google_breakpad::MicrodumpProcessor;
+using google_breakpad::ProcessState;
+using google_breakpad::SimpleSymbolSupplier;
+using google_breakpad::StackFrameSymbolizer;
+
class MicrodumpProcessorTest : public ::testing::Test {
+ public:
+ MicrodumpProcessorTest()
+ : files_path_(string(getenv("srcdir") ? getenv("srcdir") : ".") +
+ "/src/processor/testdata/") {
+ }
+
+ void ReadFile(const string& file_name, string* file_contents) {
+ assert(file_contents);
+ std::ifstream file_stream(file_name.c_str(), std::ios::in);
+ ASSERT_TRUE(file_stream.good());
+ std::vector<char> bytes;
+ file_stream.seekg(0, std::ios_base::end);
+ ASSERT_TRUE(file_stream.good());
+ bytes.resize(file_stream.tellg());
+ file_stream.seekg(0, std::ios_base::beg);
+ ASSERT_TRUE(file_stream.good());
+ file_stream.read(&bytes[0], bytes.size());
+ ASSERT_TRUE(file_stream.good());
+ *file_contents = string(&bytes[0], bytes.size());
+ }
+
+ google_breakpad::ProcessResult ProcessMicrodump(
+ const string& symbols_file,
+ const string& microdump_contents,
+ ProcessState* state) {
+ SimpleSymbolSupplier supplier(symbols_file);
+ BasicSourceLineResolver resolver;
+ StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
+ MicrodumpProcessor processor(&frame_symbolizer);
+
+ return processor.Process(microdump_contents, state);
+ }
+
+ string files_path_;
};
-// TODO(mmandlis): Add MicrodumpProcessor tests. See crbug.com/410294
+TEST_F(MicrodumpProcessorTest, TestProcess_Empty) {
+ ProcessState state;
+ google_breakpad::ProcessResult result =
+ ProcessMicrodump("", "", &state);
+ ASSERT_EQ(google_breakpad::PROCESS_ERROR_MINIDUMP_NOT_FOUND, result);
+}
+
+TEST_F(MicrodumpProcessorTest, TestProcess_Invalid) {
+ ProcessState state;
+ google_breakpad::ProcessResult result =
+ ProcessMicrodump("", "This is not a valid microdump", &state);
+ ASSERT_EQ(google_breakpad::PROCESS_ERROR_NO_THREAD_LIST, result);
+}
+
+TEST_F(MicrodumpProcessorTest, TestProcess_MissingSymbols) {
+ string microdump_file = files_path_ + "microdump.dmp";
+ string microdump_contents;
+ ReadFile(microdump_file, &microdump_contents);
+
+ ProcessState state;
+
+ google_breakpad::ProcessResult result =
+ ProcessMicrodump("", microdump_contents, &state);
+
+ ASSERT_EQ(google_breakpad::PROCESS_OK, result);
+
+ ASSERT_TRUE(state.crashed());
+ ASSERT_EQ(0, state.requesting_thread());
+
+ ASSERT_EQ(104U, state.modules()->module_count());
+ ASSERT_EQ(1U, state.threads()->size());
+ ASSERT_EQ(4U, state.threads()->at(0)->frames()->size());
+
+ ASSERT_EQ("",
+ state.threads()->at(0)->frames()->at(0)->function_name);
+ ASSERT_EQ("",
+ state.threads()->at(0)->frames()->at(3)->function_name);
+}
+
+TEST_F(MicrodumpProcessorTest, TestProcess_UnsupportedArch) {
+ string microdump_contents =
+ "W/google-breakpad(26491): -----BEGIN BREAKPAD MICRODUMP-----\n"
+ "W/google-breakpad(26491): O A \"unsupported-arch\"\n"
+ "W/google-breakpad(26491): S 0 A48BD840 A48BD000 00002000\n";
+
+ ProcessState state;
+
+ google_breakpad::ProcessResult result =
+ ProcessMicrodump("", microdump_contents, &state);
+
+ ASSERT_EQ(google_breakpad::PROCESS_ERROR_NO_THREAD_LIST, result);
+}
+
+TEST_F(MicrodumpProcessorTest, TestProcess) {
+ string symbols_file = files_path_ + "symbols/microdump";
+
+ string microdump_file = files_path_ + "microdump.dmp";
+ string microdump_contents;
+ ReadFile(microdump_file, &microdump_contents);
+
+ ProcessState state;
+
+ google_breakpad::ProcessResult result =
+ ProcessMicrodump(symbols_file, microdump_contents, &state);
+
+ ASSERT_EQ(google_breakpad::PROCESS_OK, result);
+ ASSERT_TRUE(state.crashed());
+ ASSERT_EQ(0, state.requesting_thread());
+ ASSERT_EQ(104U, state.modules()->module_count());
+ ASSERT_EQ(1U, state.threads()->size());
+
+ ASSERT_EQ(21U, state.threads()->at(0)->frames()->size());
+
+ ASSERT_EQ("content::::CrashIntentionally",
+ state.threads()->at(0)->frames()->at(0)->function_name);
+ ASSERT_EQ("content::::MaybeHandleDebugURL",
+ state.threads()->at(0)->frames()->at(1)->function_name);
+ ASSERT_EQ("content::Start",
+ state.threads()->at(0)->frames()->at(19)->function_name);
+ ASSERT_EQ("libchromeshell.so",
+ state.threads()->at(0)->frames()->at(19)->module->code_file());
+}
} // namespace
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
diff --git a/src/processor/testdata/microdump.dmp b/src/processor/testdata/microdump.dmp
new file mode 100644
index 00000000..e641a477
--- /dev/null
+++ b/src/processor/testdata/microdump.dmp
@@ -0,0 +1,157 @@
+W/IInputConnectionWrapper(26278): endBatchEdit on inactive InputConnection
+W/google-breakpad(26491): -----BEGIN BREAKPAD MICRODUMP-----
+W/google-breakpad(26491): O A "armv7l" "3.4.0-perf-g60eefcd "#1 SMP PREEMPT Fri Oct 10 18:28:38 UTC 2014"
+W/google-breakpad(26491): S 0 A48BD840 A48BD000 00002000
+W/google-breakpad(26491): S A48BD000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000AE4755410000803F000000000000803F00000000D43DFDB60000803F0000000000000000000000FF404000000100B4008CD08BA470F0DB024800000001000000636572733400000001000000AE4755410000803F000000000000803F00000000000000000000803F0000000000000000000000FF404000000100B40035FFB899E8D08BA483B3AF997D01000007000000D880E0A170C53DB70140E0A170C53DB7000000000000000004D18BA470F0DB0238C14BB7C4D18BA440D18BA400000000CCD18BA440D18BA4C4D18BA49790C5980000803FD43DFDB6000000000000803F000000000000000000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFFC8D18BA4C8D18BA48040959A219FF79800000000C2244B3A680000009CD28BA4
+W/google-breakpad(26491): S A48BD180 CCD18BA4ACD28BA4C4D18BA438C14BB7CCD18BA401000000D43DFDB60596C598F4D78BA49CD28BA4CCD18BA4F17FC598F4D78BA42B86C598000000FF404000000100B4000900000005000000F843369BDCD18BA440000000000000000000000000000000000000000000803F12000000CD4C0542D43DFDB6D43DFDB6D43DFDB650E74AB7C0DA42B784D68BA4800A49B738D38BA4C2244B3A38D38BA40E00000068D38BA40E00000050D28BA450D88BA4ACD38BA4F4D78BA4D43DFDB67564C598A0D38BA488D38BA4090000000500000000000000FFFFFFFF00000000FFFFFFFF06000000D43DFDB668D38BA4C2244B3A60D38BA4D43DFDB6A4D28BA4000000009CD88BA4C2244B3A00000000F4D78BA4A4D88BA4D43DFDB6F4D78BA40B72C5980000000000000000FFFFFFFFD0D28BA400000000FFFFFFFF0000000084D88BA468D38BA401000000F4D78BA418D38BA4000000002DB2C598B4D88BA48CD88BA494D88BA4FFFFFFFF0E0000000100000050D88BA45CD38BA468D38BA401000000
+W/google-breakpad(26491): S A48BD300 60D38BA4ACD38BA4F4D78BA459B2C59884D88BA43CD48BA450D88BA450D88BA450D88BA450D88BA450D88BA450D88BA4B8D28BA450D88BA450D88BA477BDC598F4D78BA484D88BA478D58B0084D88BA40000000001000000B8268D9A0E0000000000000006000000000000000600000000000000FFFFFFFF00000000FFFFFFFF090000000500000000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000C843369BBCD38BA40004000000000000D8D98BA43CD58BA484D98BA4D43DFDB67564C59830D58BA418D58BA409000000050000000E000000010000000E0000000100000006000000D43DFDB6F8D48BA4C2244B3AF0D48BA4D43DFDB634D48BA40000000024DA8BA4C2244B3A0000000084D98BA42CDA8BA4C2244B3A84D98BA484D98BA434DA8BA420D58BA4D8D98BA4A8D48BA400000000FFFFFFFF000000000CDA8BA4F8D48BA40100000084D98BA4A8D48BA4000000002DB2C5983CDA8BA414DA8BA41CDA8BA4BB010000986D43B7E4D48BA4
+W/google-breakpad(26491): S A48BD480 D8D98BA4ECD48BA4F8D48BA401000000F0D48BA43CD58BA484D98BA459B2C5980CDA8BA4986D43B7C8D98BA40000000000000000C8D98BA4C8D98BA477BDC59848D48BA4D8D98BA4E8D98BA40000000000000000E8D98BA4E8D98BA477BDC59800000000FFFFFFFF000000001CDA8BA40000000001000000000000000000000000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000C843369B5CD58BA40004000000000000D43DFDB600000000050000007CD58BA4D43DFDB6D43DFDB685B9C598480000000000000005000000380A4CB701000000C843369B9CD58BA40004000000000000A5833D9A800A49B7E850FDB60000000000000000BC50659A39ED2099780A49B7000000C0F0DA42B70000000001000000000000000100000000000000200843B7E850FDB6010000000100000084D68BA400000000F0DA42B779A0F89870D68BA4C2244B3A
+W/google-breakpad(26491): S A48BD600 FEFFFFFF989946B7000000007D0100008B32649A91F22099709946B7A0D88BA4385E43B70000000080010000000000007D0100000000000000000000C2244B3AF8D88BA470D78BA4000000007D0100008B32649A8BF52099000000007D010000000070C10000000080010000000000007D010000C2244B3AFEFFFFFF989946B7000000007D0100008B32649A91F22099800A49B7000000006014389B0000000080010000000000007D010000FFFFFFFFFFFFFFFF000000000000000000000000F0DA42B700000000F0DA42B7D43DFDB6D43DFDB6C2244B3A08EE42B768D78BA430D78BA420D78BA410D78BA40000000068D78BA430D78BA420D78BA447F920990000000000000000800100007D0100000000000000000000800100007D0100000000000000000000800100000000000007000000A39025995CD78BA4385E43B77C9946B768D78BA460D78BA45CD78BA40100000027A82599709946B7385E43B74CC64E9B01000000B4D88BA40F0000000100000000000000B4D88BA401000000
+W/google-breakpad(26491): S A48BD780 90D88BA42D14F998B4D88BA46BE32099010000004DA42599AA9802000000000038C14BB7CCD78BA40500000048DC8BA401000000385B569A2F000000C2244B3A50D88BA468D88BA4F4D78BA450D88BA484D88BA4F4D78BA4F4D78BA468D88BA4F4D78BA4294DC598F4D78BA484D88BA4D43DFDB62844369B38C14BB70F0000000F00000068D88BA44CC64E9B0500000038C14BB748DC8BA468D88BA400000000686A4B9B48DC8BA44CD88BA4BB48C5986600000050D88BA468D88BA4E9C1369A000000007041989A807F000043DD0E996368726F6D653A2F2F637261736800A45ED88BA450D88BA468C14BB7A3D42099C2244B3A0000000047C14BB738C14BB701001044000000000600000000000000FFFFFFFF00000000FFFFFFFF090000000500000000000000FFFFFFFF0E0000000100000000000000FFFFFFFF00000000FFFFFFFF0000000000000000C2244B3AB8C23DB784DF40B77EC74C9B70DF40B748DC8BA46BD98BA448DD8BA4F903C49848DD8BA41DD1369A409D41B77983A198
+W/google-breakpad(26491): S A48BD900 B0C23DB700000000D43DFDB6A8C23DB7CCDB8BA448DC8BA47EC74C9BA0D98BA470DF40B76BD98BA43C4B3AB74F41379A01000000FFFFFFFFFFFFFFFF6BD98BA46CD98BA46CD98BA404000000E8DD8BA401000000385B569A21000000D43DFDB67CD98BA41CDA8BA47CD98B0000000000E8DD8BA44349C59894D98BA400000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF000000000000000000000000FFFFFFFF00000000F8D98BA410000000F8D98BA48DC49D9800000000F8D98BA400000000B548C59800000000000000004CDE8BA47BD9C498000000007DDAD62000000000D43DFDB618F348B70000000000D98BA4E8D98BA40003450100000000F8D98BA4F8D98BA400DA8BA400000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF0000000000000000C2244B3A60F348B76F2FA198800000000100000074DE8BA498DA8BA448DC8BA47132A198
+W/google-breakpad(26491): S A48BDA80 98DA8BA400000000D43DFDB6682F4BB7682F4BB773F91B99E4F248B7800000008000000001000000140000002E000000986D43B7DCDA8BA4090000004800000048DC8BA4385B569A2CDB8BA40C41EFA35441EFA3C2244B3A682F4BB7209C41B7D43DFDB6699C2F9A01000000C2244B3AB8C23DB7C2244B3AA8C23DB7C2244B3A682F4BB7682F4BB7089C41B7C7552F9AACDC8BA410000000E8DD8BA410000000E8DD8BA48DC49D98E8DD8BA46949C59874DE8BA4C2244B3A74DE8BA4FCDB8BA4682F4BB770DF40B748DC8BA4010000003C4B3AB7F903C498CCDB8BA4D335379A9935379A0100000000010000D43DFDB62E000000D43DFDB604DE8BA4D43DFDB600000000F776A298E705030008000000D43DFDB690D03BB714DE8BA410D83CB714DE8BA4E706A298F8B343B7000000C014DC8BA400B443B73CDC8BA4F93AFAB600B443B714DC8BA414DC8BA4A8C23DB7A4DF40B70E000000FFFFFFFFDCBC889AF3B6889A680300009935379AD43DFDB6D43DFDB665D6EB98A9D5EB98681C3EB7
+W/google-breakpad(26491): S A48BDC00 000000000000000090D23BB700000000BCE18BA400000000000000001000000000000000FFFFFFFF18000000010000001A0000002E00000000000000FFFFFFFF0000000001010000B8C24BB7070F699A17000000385B569A97C24BB788C24BB7010E699A000000000600000000000000FFFFFFFF00000000FFFFFFFF090000000500000000000000FFFFFFFF0E0000000100000000000000FFFFFFFF00000000FFFFFFFF000000000000000010094BB77DDAD6202E0000009DDD1B22E8084BB7E8084BB700DD8BA400000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF000000000000000001000000010000020500000001DE8BA400D13BB70037A298F4AE3CB7000000000000000024DD8BA424DD8BA400000000000000000000000000DF8BA4C2244B3AFCF732039200000048DD8BA448DD8BA400000000B335FAB6F55805212E000000FFFFFFFFFFFFFFFF0000000001000000
+W/google-breakpad(26491): S A48BDD80 0000000098664BB712000000385B569AECE08BA470664BB770664BB700C29D9800000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF0000000000000000C0664BB7000000001000000071B6A09898664BB798664BB70000000000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF0000000000000000000000000000000000000000003DFDB678C63DB7DD7FB7FC3E652E00FFFFFFFFFFFFFFFF00C63DB700C93DB7D8E08BA4E706A298C2244B3A74DE8BA474DE8BA400000000000000000D03A298D43DFDB60100000034134AB704E28BA4D43DFDB6010000002C134AB704E28BA401000000E706A298000000000D03A298010000000100000000000000010000000001000000000000000000000D03A298200100009B3B2099D27CBA0004000000800C49B7840C49B7
+W/google-breakpad(26491): S A48BDF00 FBFFFFFFC2244B3A000000000000000038C63DB7D8D942B701000000CFB7379AD8D942B7C2244B3AD43DFDB6C2244B3A74C63DB7C2244B3A78C63DB701000000070000006B109F9868DF8BA438A43DB7D43DFDB66CC63DB774C63DB73D471F9930134AB70100000038A43DB730134AB701000000C2244B3A14000000C2244B3A01000000D43DFDB6BCE18BA428CA3DB70000000014000000010000000100000014000000CD7DA298C2244B3A5B7FA29800010000E78EA098D8D942B7C2244B3AD8D942B728E08BA414000000D3C0379A508E525462E60700000000000000000058A641B7EDCF379A625A92FC3E652E0014E08BA4C2244B3A08D740B7682F4BB76CC63DB728CA3DB738C93DB7D8E08BA444384D9B190F599AD43DFDB609481F99E9471F99682F4BB73CC63DB723891B9AECE08BA430863AB77A010100BDF4EB9830863AB7C2244B3A682F4BB7F0FB3DB728CA3DB7B7CD1C9AB5D31C9AC1D31C9AB5D31C9A3CC63DB7682F4BB7682F4BB7ECE08BA428CA3DB738C93DB7E5E4EB98
+W/google-breakpad(26491): S A48BE080 000000000000000000000000000000000000000000000000006642B70000000000000000C2244B3A00000000C2244B3AD43DFDB6C2244B3AD43DFDB634134AB7000000401F000000FE1BCFFB3D0000000F5C05212E00000000000000A8E18BA4E803000000E38BA4190F599A80CD4BB7A8E18BA4BCE18BA400E38BA479CD4BB768CD4BB7C2244B3A10E18BA400E38BA4BCE18BA468C74C9B0000000090E18BA400E38BA4190F599AA4E78BA455D59E98D43DFDB6FD97A098C2244B3A18E38BA4D43DFDB690D03BB70000000090D03BB701000000E706A298DCE68BA490D03BB7010000000000000000000000660E599A010000000000000002E430F48F03A29800E38BA4C2244B3A01000000C2244B3A11D0EB98C2244B3A00000000C2244B3AA0C23DB7000000C000000000A8C23DB701000000C2244B3A20134AB7000000000000000090D23BB70000000004E58BA40000000000DC8BA414A43DB7D0E68BA4D43DFDB600E38BA404E28BA40100000000E38BA40000000000000000E39DA098
+W/google-breakpad(26491): S A48BE200 D43DFDB620134AB78CE78BA403000000FFFFFFFF38E28BA490D03BB70000000090D03BB703C19D980000000080D03BB7D43DFDB67792A09890D03BB72E00000018023EB7A57D1B9A58EA2A9B571F819A5401000059901B9A000000000B000000000000000B000000000000000B00000000010000C2244B3A60A94AB7D0E28BA4189849B7DCE68BA40CE78BA4C59F9E982E000000B8E28BA4B8E28BA4212EA1981500000079A3A09808054BB7D4E28BA401000000C2244B3A08E38BA4D0E68BA400E38BA46235E020DCE68BA46D9EA098D0E68BA400E38BA400000000D0E68BA400E38BA46235E020DCE68BA40CE78BA460D13BB7000000000000000055B2A09848503CB7030000000F5C05212E0000000000000000000000502F4BB7F5CAEB9804C2949A19E3629A5C00000011D0EB98F20000000100000048D13BB7D0E68BA46235E0202E000000010000009BB8A098D43DFDB6D43DFDB66235E0202E0000006D363600000000000001000090083EB7A8FA3DB7080000000000000008000000
+W/google-breakpad(26491): S A48BE380 000100000500000028AE3DB7F0E38BA41CE48BA44CE48BA4E8CF3DB7F0E38BA4A8FA3DB76F7F9F989D571F994798379A04000000D86DF800AC2B989AD43DFDB6000000006C40549A010000000000000060E83CB725AE379A5B76379A000000005B76379A000000005B76379A00000000E8CF3DB701B5379A00000000C4A33DB7C8A33DB72CE48BA403000000C2244B3ADCE48BA4D43DFDB6D0E68BA4C0E58BA430E68BA4F8E7889A6CE58BA400E68BA40100000011ACA09830E68BA4FFB5A298C2244B3AD0E68BA4D0E68BA40600000000000000060000000001000089083BB770083BB7A0E48BA4D8043EB7D8043EB734C83DB70600000000000000060000000001000080FE3AB74CC64E9B0300000008583BB7B8E48BA4DCE48BA434C83DB704C83DB7B8E48BA4D43DFDB615B0379A80FE3AB70100000000000000000000000000000000000000000000000000000000000000000000000000000028583BB76CC63DB7E8E48BA400000000C2244B3A04E58BA430E58BA4C0E58BA48381A198
+W/google-breakpad(26491): S A48BE500 30E68BA4000000000000000090D23BB7000000000000000000000000BCE18BA4C2244B3AD0E68BA4A8E58BA4D996A098D0E68BA40000000001000000010001000000000030E58BA4D0E68BA413ED389A0100000084168D9A9CE68BA40100000000000000D43DFDB60C000000B4E88BA4000000000000000000000000000000000000000000000000000000000000000058203E9B8DE58BA46A5C05212E00000048CF3BB770245C0028833E9B00000000A8E58BA4A8E58BA4000000000000000000000000008000000000000090FF3AB7B0003BB730023BB70A000000A7C4589A0000000088993DB738FB3AB704E68BA404E68BA4A7719F9831FB3AB720FB3AB728BB359B00E68BA420E68BA478E83CB720E68BA404E68BA404E68BA4FFFFFFFF00000000000000000000000000000000C81D3E9B01000000C09C3DB7E8823E9B010001B700000000D0B33DB709670000D8B63DB70967000000FA3AB7382D3BB78C3B989AB0023DB7FCF93AB7E8F93AB73CC63DB700000000FFFFFFFF08000000
+W/google-breakpad(26491): S A48BE680 09000000FFFFFFFF00000000C2244B3AFFFFFFFFD43DFDB6D43DFDB6A7C4589A00000000BCE88BA4B4E88BA4BD569F989CE68BA4656E2D5553008BA401000000C8E98BA4B9E68BA4B4E68BA4656E2D5520B9359B48D13BB700000000E06343B7A86343B7186443B7349F44B7E06343B7A86343B7186443B7349F44B7C89E44B7260000000000000000000000189849B7C09849B7989B49B70000000013E78BA46235E0202E00000038D03AB738D03AB7A8D03AB73C083BB738D03AB738D03AB7A8D03AB73C083BB730083BB7080000000000000028C941B73CC941B748C941B700000000000000000000000000000000D4E78BA4DFA19D98D4E78BA46CE78BA46CE78BA40000000030E58BA420134AB708A43DB714A43DB718A43DB7000000000000000098E78BA480D03BB7304C3DB720D13BB7FFC49D98D43DFDB6C2244B3ABCE88BA4BCE88BA4384B3AB702000000D43DFDB6B4E88BA410000000D8CC4A9BC071D1127B24549AD4E78BA4D43DFDB6D43DFDB6F776A2980100000001000000
+W/google-breakpad(26491): S A48BE800 C2244B3ACD7DA298C2244B3A5B7FA29807000000080000001809D873C2244B3A1809D87394EA8BA45CE88BA494EA8BA45CE88BA48DE418B5883E989AD43DFDB60C3E3CB700000000FF0100005B8C08B594EA8BA490420FB70000000098383AB730413AB790420FB798383AB7430000005500000000000000983A2CB504000000013DFDB6C2244B3A4E051000C2244B3AD4E88BA438C03CB7B4E88BA4D43DFDB6BCE88BA4382D3BB7C04EC212B725549A9CE88BA4382D3BB70000000072656E6465726572001C549AD43DFDB6C4E88BA4BCE88BA4747970650000000042FA3AB730FA3AB7D8E88BA4D4E88BA479B60AB554E98BA4A852FDB600000000D8E98BA450E98BA454E98BA458E98BA4604D0FB70300000098383AB70000000021B524B540E98BA444E98BA4000000000100000057EBC4A428000000010000001A00000038C03CB703000000609AD412B335FAB60000FDB628000000000000006FC74C9BD43DFDB6609AD41298383AB7C2244B3AC071D112C2244B3A38C03CB73CC24E9B
+W/google-breakpad(26491): S A48BE980 38C03CB76FC74C9BD43DFDB6609AD41298383AB7CD1F549A30413AB7C8422DB5C0EA8BA400EA8BA42757000018EA8BA438EA8BA4D43DFDB6604D0FB700000000E0EA8BA420EA8BA4384B3AB70000000058EA8BA484EA8BA4000000000000000000000000FC9329B5109429B530413AB708EA8BA484EA8BA440C0D7734300000000000000010000000075D01298383AB7010000000700000098383AB730413AB790420FB798383AB7430000004300000000000000C04EC21220422DB501413AB79796ACA401000000C8EA8BA4C8EA8BA400EB8BA4000000000000000000000000090000000000000018EA8BA40000000001000000000000000000430000005500090000000000430038EA8BA4C2244B3A005AC712AF010000005AC712B808DA7305000000609AD41298383AB75B64D5A46808DA7300000000010000000075D0120000000040C0D77384EA8BA400000000C2244B3A005AC712B808DA7305000000609AD412C04EC212C071D112A978DCA4B808DA73005AC71240C0D77305000000
+W/google-breakpad(26491): S A48BEB00 609AD412005AC71240C0D7738D59DCA440C0D773804FC2120F000000D43DFDB6609AD41204000000FF0100000000000000000000A09C29B544A429B500A429B500000000409AD412609AD41204000000FF010000000000000000000001000000000000000100000001000000B0420FB790420FB7C071D112804FC212A08BBA6FF8EB8BA400000000C0EB8BA40D3C0F72A08BBA6FE4EB8BA4D43DFDB630413AB7B0EB8BA460EC8BA4E0EB8BA4093B07B500000000804FC21220A90EB7D43DFDB6A08BBA6F1C393AB798383AB7A08BBA6F78EC8BA4E1711BB560EC8BA42C298070040000002C29807060EC8BA4D43DFDB698383AB7430000000000000000000000000000000000000001000000FFFFFFFF8B000000C2244B3AA0423AB730413AB70000000060EC8BA448EC8BA440ED8BA460ED8BA4804FC2122C29807039431FB560EC8BA42C29807078EC8BA47DADF8B610000000450FD9B5010000000F00000000000000000000002C298070010000000400000078EC8BA4804FC21203000000
+W/google-breakpad(26491): S A48BEC80 0051FDB6B335FAB60000FDB6C2244B3ABCEC8BA428F839B7D43DFDB6D8ED8BA428ED8BA4E86F2DB560ED8BA4092E22B510F839B7000000C00000000018F839B728ED8BA418F839B70000000098383AB788712DB504FDFFFFE86F2DB540ED8BA44300000021AB20B500000000000000000000000000000000000000000000000000000000405B2DB5D43DFDB638ED8BA4109C29B5DC9429B5109C29B5FC9329B5109429B50000000001000000000000000000000000005500000000000000550098383AB730413AB790420FB798383AB7430000005500000000000000000000000000430078000000E03E3AB7051BF9B6FFFFFFFF000000000000000000000000210000001000000018F839B7C2244B3AFFFFFFFFD83E3AB7183F3AB7D83E3AB778000000E03E3AB7E03E3AB789E8F8B6D0ED8BA4A9E8F8B689E8F8B6E03E3AB789E8F8B67DC8F8B6D0ED8BA400000000D0ED8BA4D83E3AB7160000000000000000000000C2244B3A1C3F3AB70000000000000000000000000000000000000000
+W/google-breakpad(26491): S A48BEE00 000000000000000098383AB70000000000000000A0433AB7000000000000000000000000C8083BB7187A3CB788053DB730FF3BB7107A3EB70100000018293BB730A241B700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+W/google-breakpad(26491): S A48BEF80 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+W/google-breakpad(26491): C 0600004050D88BA42F000000010000000000000050D88BA468D88BA4686A4B9B48DC8BA44CD88BA401000000D43DFDB648DD8BA4F3A19D9840D88BA4F9C1369A96A9369A300000680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+W/google-breakpad(26491): M 987AB000 00000000 02BAF000 76304586D0CD2C8FF899C602BF1756A20 libchromeshell.so
+W/google-breakpad(26491): M 9B35A000 00000000 0015C000 000000000000000000000000000000000 RELRO:libchromeshell.so (deleted)
+W/google-breakpad(26491): M 9B4B6000 02D0A000 00016000 000000000000000000000000000000000 libchromeshell.so
+W/google-breakpad(26491): M A47A3000 00000000 00011000 AC480D966558562B46D4583A55D904E60 libchromium_android_linker.so
+W/google-breakpad(26491): M AC35D000 00000000 00003000 932CC9935B065A05D39E38681E0A5F2E0 libwebviewchromium_loader.so
+W/google-breakpad(26491): M AC360000 00000000 00010000 E2C6CBE7D4588EF8111B01903B27FEA80 libandroid.so
+W/google-breakpad(26491): M AC370000 00000000 00142000 83D249BAACD2F2C10C13B70C1F64252C0 libGLESv2_adreno.so
+W/google-breakpad(26491): M AC4B3000 00000000 00034000 58A32EAAFDADB17139F988E96B860C8E0 libGLESv1_CM_adreno.so
+W/google-breakpad(26491): M AC4E7000 00000000 00034000 C71008FE91C209D6D5E9EA5DBB44BF080 libgsl.so
+W/google-breakpad(26491): M AC51B000 00000000 0002A000 134B50AAA945C8C16B0021DF014AA6150 libEGL_adreno.so
+W/google-breakpad(26491): M ACE37000 00000000 00018000 9D372357993C7650365479A34E676E290 libjavacrypto.so
+W/google-breakpad(26491): M ACE4F000 00000000 00009000 0D2147262F4305E3AED211CB96FC96BA0 librs_jni.so
+W/google-breakpad(26491): M ACE58000 00000000 00006000 3F276EEAE72C2C9FC768FF2E482957510 libaudioeffect_jni.so
+W/google-breakpad(26491): M ACE5E000 00000000 00004000 CDA9BA072D4DECC71C5E63467275E7EE0 libsoundpool.so
+W/google-breakpad(26491): M ACE62000 00000000 0000E000 D02CB251CF8787A770DE2CFDC52A2B040 libstagefright_amrnb_common.so
+W/google-breakpad(26491): M ACE70000 00000000 0001B000 F59669C665FE4B073886A8DAAECEA86F0 libvorbisidec.so
+W/google-breakpad(26491): M ACE8B000 00000000 00004000 9FC00D0B150FE9FC57763A76206D1D550 libstagefright_yuv.so
+W/google-breakpad(26491): M ACE90000 00000000 0001F000 C2D6408786A8582A0EAE64D047577F800 libstagefright_omx.so
+W/google-breakpad(26491): M ACEAF000 00000000 00003000 E11DA546CE9E08D1D647E8E1135DAD810 libstagefright_enc_common.so
+W/google-breakpad(26491): M ACEB2000 00000000 00007000 741CC494F5299870A1C62FD71E37AE5F0 libstagefright_avc_common.so
+W/google-breakpad(26491): M ACEB9000 00000000 00005000 D3EA22EB9F383751AB500AE5951F0DB30 libpowermanager.so
+W/google-breakpad(26491): M ACEBE000 00000000 0003C000 F19A7DFF3B6F3AF94EAE23CA21905BAD0 libopus.so
+W/google-breakpad(26491): M ACEFA000 00000000 0001B000 87AFCC5E47ED503148F1AA03777E88590 libdrmframework.so
+W/google-breakpad(26491): M ACF16000 00000000 00114000 A0D663218D972496B104B7B9FF0727BD0 libstagefright.so
+W/google-breakpad(26491): M AD02A000 00000000 00016000 55B5F5E024DB37CABEC6A8F31DD950870 libmtp.so
+W/google-breakpad(26491): M AD040000 00000000 0000B000 D2AB743CCCD8D2EB9B66A47707CC1E530 libjhead.so
+W/google-breakpad(26491): M AD04C000 00000000 0002C000 4D1E2F0F58012FABA091A21E4CEEFFE20 libexif.so
+W/google-breakpad(26491): M AD078000 00000000 0003C000 20D19E07A0CA5B5790EEB83C8F6915570 libmedia_jni.so
+W/google-breakpad(26491): M AFE8A000 00000000 00003000 8FF5949AE957364C270D0F448DAD4FE20 libjnigraphics.so
+W/google-breakpad(26491): M AFE8D000 00000000 00008000 F2B1298EE4C6EA0900CDACD17FB5C16B0 libcompiler_rt.so
+W/google-breakpad(26491): M AFE95000 00000000 00004000 37FA52E92BF716E0268B9619EE8D61630 libadreno_utils.so
+W/google-breakpad(26491): M AFE9B000 00000000 00003000 F36630BD0C6DC4B52A0E5D5D57BE682A0 memtrack.msm8960.so
+W/google-breakpad(26491): M B15AB000 00000000 00038000 FE4EB304B0639D600DFB5871136831C50 libjavacore.so
+W/google-breakpad(26491): M B4FC8000 00000000 00009000 CF0326786BDECFB45A519C7005E851000 libbacktrace_libc++.so
+W/google-breakpad(26491): M B4FD2000 00000000 00304000 3E343A5B3F9534F5E40AD9BEAC46C8E80 libart.so
+W/google-breakpad(26491): M B52F9000 00000000 00004000 3CBDF0DE27B9554508AD60FDC96CBC620 libusbhost.so
+W/google-breakpad(26491): M B52FD000 00000000 00041000 36F280D15D51F4EEFA92279E8BBD84360 libssl.so
+W/google-breakpad(26491): M B533E000 00000000 0005F000 D02DDA779C053EF3CC279A1E1789C4250 libsqlite.so
+W/google-breakpad(26491): M B539E000 00000000 0000F000 F954BA248E12C9AF32F54434F977FEF80 libsoundtrigger.so
+W/google-breakpad(26491): M B53AD000 00000000 0000E000 125671BDF56FEE67902BE338575373000 libselinux.so
+W/google-breakpad(26491): M B53BB000 00000000 00004000 4E6C8C876BA563C3C4B0B3BA562093920 libprocessgroup.so
+W/google-breakpad(26491): M B53BF000 00000000 0045B000 83C5B450634DDB5C4FC41CA61A35B3740 libpdfium.so
+W/google-breakpad(26491): M B581F000 00000000 00004000 56B149396A4DAF176E26B4A85DA87BF30 libnetd_client.so
+W/google-breakpad(26491): M B5823000 00000000 00007000 A20D742D5BF711D12587563B5C4BF64A0 libnativehelper.so
+W/google-breakpad(26491): M B582A000 00000000 00004000 495F8887F27909EE1E3E69A657E0A9AB0 libnativebridge.so
+W/google-breakpad(26491): M B582E000 00000000 0000C000 31B45FE1FA6CC789F945332C6FECF9750 libminikin.so
+W/google-breakpad(26491): M B583A000 00000000 00003000 CCA8BE0D07D24523C8D02FEE5F724EA70 libmemtrack.so
+W/google-breakpad(26491): M B583D000 00000000 00015000 60A6E0B998632198B80EB0941121CD710 libstagefright_foundation.so
+W/google-breakpad(26491): M B5852000 00000000 00051000 6E42AB0836D73C21533C08A98EE7B24C0 libsonivox.so
+W/google-breakpad(26491): M B58A8000 00000000 0000F000 E43E7FA869E4BCDAA3CC9601DF5A6A520 libcommon_time_client.so
+W/google-breakpad(26491): M B58B7000 00000000 0000A000 C84019C90BCA7E95A773B5A75A460D880 libnbaio.so
+W/google-breakpad(26491): M B58C1000 00000000 0009A000 895A37F76D93E51B0ED7E90E5B71A9330 libmedia.so
+W/google-breakpad(26491): M B595B000 00000000 0003C000 C5323479053FDA41E355482925A30D120 libinputflinger.so
+W/google-breakpad(26491): M B5997000 00000000 0001B000 74F168649BE8583159D23A6406D107740 libinput.so
+W/google-breakpad(26491): M B59B2000 00000000 0000F000 41712F8718C430707F8CEE5532CB59200 libimg_utils.so
+W/google-breakpad(26491): M B59C1000 00000000 00032000 89A4F06810290EEAF309C12642A3ECFA0 libjpeg.so
+W/google-breakpad(26491): M B59F4000 00000000 0022F000 65E6AAFD915FB244BFE6BE6C4E5E3EC40 libskia.so
+W/google-breakpad(26491): M B5C28000 00000000 0001D000 23FBB5490C5DBF1E99CD76AC2AA151410 libRScpp.so
+W/google-breakpad(26491): M B5C45000 00000000 00028000 3BFE44EFE288C7A1AD7BE317B9F1BDBC0 libpng.so
+W/google-breakpad(26491): M B5C6D000 00000000 0005A000 659F1470013A04F7702E4BAB65F034E70 libft2.so
+W/google-breakpad(26491): M B5CC7000 00000000 0003D000 FB93884C5EC21F71C68861C20993EB6C0 libbcinfo.so
+W/google-breakpad(26491): M B5D04000 00000000 00023000 21B734672A14ED6267B966640C16823E0 libbcc.so
+W/google-breakpad(26491): M B5D47000 00000000 00094000 BE6F28596E6CE20F5E49A9E0BC824DA00 libc++.so
+W/google-breakpad(26491): M B5DDD000 00000000 00938000 377A25164D6ACDC0F7A38F5E378EC8670 libLLVM.so
+W/google-breakpad(26491): M B671C000 00000000 0003A000 8D7E15A890FAF52D874044C9F02C6D130 libRS.so
+W/google-breakpad(26491): M B6756000 00000000 0004C000 670166E37528A7F183D1B05F52020ABD0 libhwui.so
+W/google-breakpad(26491): M B67A2000 00000000 00110000 1B1FD653750DE88B86D7E83095EE37160 libicuuc.so
+W/google-breakpad(26491): M B68B6000 00000000 00006000 F4F99E4A6E63BF8C8005D96B2BAC8CEB0 libgabi++.so
+W/google-breakpad(26491): M B68BC000 00000000 00167000 237F53C12084A7F42405B410FDE8B4020 libicui18n.so
+W/google-breakpad(26491): M B6A23000 00000000 00048000 AC5AE16EC01F4362C8E63DF66565090D0 libharfbuzz_ng.so
+W/google-breakpad(26491): M B6A6B000 00000000 00005000 254351EC49125FE3A72F78EAB38381410 libwpa_client.so
+W/google-breakpad(26491): M B6A70000 00000000 00007000 F8BA9819E3B7FA0BE155985B6C09FC570 libnetutils.so
+W/google-breakpad(26491): M B6A77000 00000000 00006000 C08391F010B5A32265D4D781325FFCEE0 libhardware_legacy.so
+W/google-breakpad(26491): M B6A7E000 00000000 00017000 B98E65710C415C83E972EBDC1EB52AC00 libexpat.so
+W/google-breakpad(26491): M B6A95000 00000000 00102000 E26A420F0A5BCD2AC04E9B7B19F67C3D0 libcrypto.so
+W/google-breakpad(26491): M B6B99000 00000000 00003000 914425D16565257955F7E1574360B71F0 libhardware.so
+W/google-breakpad(26491): M B6B9C000 00000000 0000C000 4F3E1A188AE72585AF4278E4FA5266730 libui.so
+W/google-breakpad(26491): M B6BA8000 00000000 00003000 2D9083CB8C22C02E1412DA13B1CA43AE0 libsync.so
+W/google-breakpad(26491): M B6BAB000 00000000 0004F000 559E784386AC5E53A9D4D7F9916AA7F90 libgui.so
+W/google-breakpad(26491): M B6BFA000 00000000 00008000 D8696CD80D9B725AFEA007DFCE2562E60 libcamera_metadata.so
+W/google-breakpad(26491): M B6C02000 00000000 0003A000 116B760482930C77445ABAC1A3276D0B0 libcamera_client.so
+W/google-breakpad(26491): M B6C3C000 00000000 00006000 AC1D054A26491BE96E8BCCB1E5F2926F0 libspeexresampler.so
+W/google-breakpad(26491): M B6C42000 00000000 00006000 D330B25521C028B95D7E9360F7C6D6510 libaudioutils.so
+W/google-breakpad(26491): M B6C48000 00000000 0001A000 03AD92B0BEDAA751C0016E97AE374CAE0 libz.so
+W/google-breakpad(26491): M B6C62000 00000000 00030000 AC6C388A36224541CD74B35818111B760 libbinder.so
+W/google-breakpad(26491): M B6C92000 00000000 00028000 102764B5F4D4D6F6F1A0C7360182BDEE0 libandroidfw.so
+W/google-breakpad(26491): M B6CBA000 00000000 0000B000 E2F67EE50006FD0ED1482E1463C5CCFF0 libGLESv2.so
+W/google-breakpad(26491): M B6CC5000 00000000 00007000 EFE6AB19F4060BCECF8CF0E68958C2F60 libGLESv1_CM.so
+W/google-breakpad(26491): M B6CCC000 00000000 00004000 C91EAF69D18F0D499BD58532BBA173690 libETC1.so
+W/google-breakpad(26491): M B6CD0000 00000000 00004000 7AE0C00FAEDEA3E81109CC784D49A6960 libunwind-ptrace.so
+W/google-breakpad(26491): M B6CD4000 00000000 0000E000 EF89B10946BDF6079AAF789F56192FDA0 libunwind.so
+W/google-breakpad(26491): M B6D28000 00000000 00007000 3874D35A672DF92604963290963F44990 libgccdemangle.so
+W/google-breakpad(26491): M B6D31000 00000000 00008000 45B51BF91D330E793C9142C2617D7A8E0 libbacktrace.so
+W/google-breakpad(26491): M B6D3A000 00000000 00018000 4939CC7D9325757DDAB52A218D55F4720 libutils.so
+W/google-breakpad(26491): M B6D52000 00000000 0003B000 2FE003E5119C67BABE1A9FAB459A5A5D0 libstlport.so
+W/google-breakpad(26491): M B6D8D000 00000000 0000D000 8AE85E0A2B96C0006F4BC72D01BDB7BD0 libcutils.so
+W/google-breakpad(26491): M B6D9B000 00000000 00071000 A12BAF7D82BE28EC681730452D351E880 libGLES_trace.so
+W/google-breakpad(26491): M B6E0C000 00000000 00068000 924D4C5446BF1132A902C15519E5C4FD0 libEGL.so
+W/google-breakpad(26491): M B6E77000 00000000 000DC000 EE75A142ED1607624B6579D4590DD7CB0 libandroid_runtime.so
+W/google-breakpad(26491): M B6F53000 00000000 00004000 DFCD7772F3A5BD1E84A50C4DBFDE6F570 libstdc++.so
+W/google-breakpad(26491): M B6F57000 00000000 00019000 AE3467401278371A956801500FC8187D0 libm.so
+W/google-breakpad(26491): M B6F71000 00000000 00007000 0A492DEF82842051996A468D87F23F010 liblog.so
+W/google-breakpad(26491): M B6F79000 00000000 0005A000 10EC186B04E97F6A24DAA891779479380 libc.so
+W/google-breakpad(26491): M B6FDD000 00000000 00003000 D773C773634B82249E887ECBC5D28C900 libsigchain.so
+W/google-breakpad(26491): -----END BREAKPAD MICRODUMP-----
+W/google-breakpad(26354): ### ### ### ### ### ### ### ### ### ### ### ### ###
+W/google-breakpad(26354): Chrome build fingerprint:
+W/google-breakpad(26354): Developer Build
+W/google-breakpad(26354): 1
+W/google-breakpad(26354): ### ### ### ### ### ### ### ### ### ### ### ### ###
+--------- beginning of crash
+F/libc (26354): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 26375 (CrRendererMain)
+D/audio_hw_primary( 195): disable_audio_route: reset and update mixer path: low-latency-playback
+D/audio_hw_primary( 195): disable_snd_device: snd_device(2: speaker)
+I/DEBUG (17356): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
+I/DEBUG (17356): Build fingerprint: 'google/occam/mako:5.0/LRX21J/1543521:userdebug/dev-keys'
+I/DEBUG (17356): Revision: '10'
+I/DEBUG (17356): ABI: 'arm'
+I/DEBUG (17356): pid: 26354, tid: 26375, name: CrRendererMain >>> org.chromium.chrome.shell:sandboxed_process0 <<<
+I/DEBUG (17356): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
+I/DEBUG (17356): r0 a48bd850 r1 0000002f r2 00000001 r3 00000000
+I/DEBUG (17356): r4 a48bd850 r5 a48bd868 r6 9b4b6a68 r7 a48bdc48
+I/DEBUG (17356): r8 a48bd84c r9 00000001 sl b6fd3dd4 fp a48bdd48
+I/DEBUG (17356): ip 989da1f3 sp a48bd840 lr 9a36c1f9 pc 9a36a996 cpsr 68000030
+I/DEBUG (17356):
+I/DEBUG (17356): backtrace:
+I/DEBUG (17356): #00 pc 01bbf996 /data/app/org.chromium.chrome.shell-1/lib/arm/libchromeshell.so
+I/DEBUG (17356):
+I/DEBUG (17356): Tombstone written to: /data/tombstones/tombstone_00
+W
diff --git a/src/processor/testdata/symbols/microdump/libchromeshell.so/76304586D0CD2C8FF899C602BF1756A20/libchromeshell.so.sym b/src/processor/testdata/symbols/microdump/libchromeshell.so/76304586D0CD2C8FF899C602BF1756A20/libchromeshell.so.sym
new file mode 100644
index 00000000..70f1589c
--- /dev/null
+++ b/src/processor/testdata/symbols/microdump/libchromeshell.so/76304586D0CD2C8FF899C602BF1756A20/libchromeshell.so.sym
@@ -0,0 +1,249 @@
+MODULE Linux arm 76304586D0CD2C8FF899C602BF1756A20 libchromeshell.so
+FILE 46 /s/chrome-brkpad/src/out/Debug/../../base/bits.h
+FILE 47 /s/chrome-brkpad/src/out/Debug/../../base/build_time.cc
+FILE 48 /s/chrome-brkpad/src/out/Debug/../../base/callback.h
+FILE 177 /s/chrome-brkpad/src/out/Debug/../../base/memory/weak_ptr.h
+FILE 178 /s/chrome-brkpad/src/out/Debug/../../base/message_loop/incoming_task_queue.cc
+FILE 179 /s/chrome-brkpad/src/out/Debug/../../base/message_loop/message_loop.cc
+FILE 183 /s/chrome-brkpad/src/out/Debug/../../base/message_loop/message_pump.cc
+FILE 184 /s/chrome-brkpad/src/out/Debug/../../base/message_loop/message_pump_android.cc
+FILE 185 /s/chrome-brkpad/src/out/Debug/../../base/message_loop/message_pump_default.cc
+FILE 272 /s/chrome-brkpad/src/out/Debug/../../base/rand_util.cc
+FILE 273 /s/chrome-brkpad/src/out/Debug/../../base/rand_util_posix.cc
+FILE 274 /s/chrome-brkpad/src/out/Debug/../../base/run_loop.cc
+FILE 275 /s/chrome-brkpad/src/out/Debug/../../base/safe_strerror_posix.cc
+FILE 384 /s/chrome-brkpad/src/out/Debug/../../base/tracking_info.h
+FILE 385 /s/chrome-brkpad/src/out/Debug/../../base/tuple.h
+FILE 2458 /s/chrome-brkpad/src/out/Debug/../../content/app/android/content_main.cc
+FILE 2459 /s/chrome-brkpad/src/out/Debug/../../content/app/android/library_loader_hooks.cc
+FILE 2460 /s/chrome-brkpad/src/out/Debug/../../content/app/content_main_runner.cc
+FILE 3100 /s/chrome-brkpad/src/out/Debug/../../content/child/child_shared_bitmap_manager.cc
+FILE 3101 /s/chrome-brkpad/src/out/Debug/../../content/child/child_thread.cc
+FILE 3102 /s/chrome-brkpad/src/out/Debug/../../content/child/child_thread.h
+FILE 3103 /s/chrome-brkpad/src/out/Debug/../../content/child/content_child_helpers.cc
+FILE 3366 /s/chrome-brkpad/src/out/Debug/../../content/common/message_router.cc
+FILE 3398 /s/chrome-brkpad/src/out/Debug/../../content/common/ssl_status_serialization.cc
+FILE 3402 /s/chrome-brkpad/src/out/Debug/../../content/common/user_agent.cc
+FILE 3403 /s/chrome-brkpad/src/out/Debug/../../content/common/utility_messages.h
+FILE 3808 /s/chrome-brkpad/src/out/Debug/../../content/renderer/render_frame_impl.cc
+FILE 3822 /s/chrome-brkpad/src/out/Debug/../../content/renderer/renderer_blink_platform_impl.cc
+FILE 3823 /s/chrome-brkpad/src/out/Debug/../../content/renderer/renderer_clipboard_client.cc
+FILE 3824 /s/chrome-brkpad/src/out/Debug/../../content/renderer/renderer_main.cc
+FILE 4111 /s/chrome-brkpad/src/out/Debug/../../ipc/ipc_channel_handle.h
+FILE 4112 /s/chrome-brkpad/src/out/Debug/../../ipc/ipc_channel_posix.cc
+FILE 4113 /s/chrome-brkpad/src/out/Debug/../../ipc/ipc_channel_proxy.cc
+FUNC 241df8 4 0 xsltStrxfrm
+FUNC 241dfc 1c 0 base::debug::StackTrace::StackTrace
+242378 2 1361 76
+24237a 22 1361 76
+24239c 10 26 75
+FUNC 2423ac 1fc 0 base::debug::TaskAnnotator::RunTask
+2423b6 2 31 75
+24254a 4 60 75
+24254e 6 401 48
+25e6bc c 208 179
+FUNC 25e6c8 1a 0 base::MessageLoop::Run
+25e6c8 4 306 179
+25e6cc 6 307 179
+25e6d2 6 308 179
+25e6d8 6 308 179
+FUNC 25ed20 128 0 base::MessageLoop::RunTask
+25ed20 c 432 179
+25ed2c 2 432 179
+25edca 6 444 179
+25edd0 12 447 179
+25ede2 a 192 16276
+FUNC 25ee48 140 0 base::MessageLoop::DeferOrRunPendingTask
+25ee48 4 454 179
+25ee4c 4 455 179
+25ee64 8 456 179
+25ee6c 6 459 179
+25ee72 a 672 16220
+25ee88 14 1061 16220
+25fb9e 1e 372 179
+FUNC 25fbbc 70 0 base::MessageLoop::RunHandler
+25fbfc 6 405 179
+25fc02 8 415 179
+25fc0a 6 415 179
+FUNC 2601e2 98 0 base::MessageLoop::DoWork
+2601e2 4 544 179
+26023a 2 562 179
+26023c 8 563 179
+260244 8 563 179
+26024c c 565 179
+260258 8 566 179
+26031c 8 158 179
+FUNC 260840 104 0 base::MessagePumpDefault::Run
+26088e 4 36 185
+260892 8 32 185
+26089a 2 33 185
+26d14a 1e 92 274
+FUNC 26d168 30 0 base::RunLoop::Run
+26d168 4 47 274
+26d17c 6 54 274
+26d30c 6 43 314
+26d312 6 12 280
+71338c 6 420 4113
+713392 1e 421 4113
+FUNC 7133b0 188 0 IPC::ChannelProxy::Context::OnDispatchMessage
+7134ce 4 270 4113
+7134d2 8 271 4113
+7134da a 274 4113
+FUNC a497e8 26 0 content::MessageRouter::RouteMessage
+a497e8 2 49 3366
+a497ea 2 49 3366
+a497f6 8 50 3366
+a497fe 2 51 3366
+a49800 8 54 3366
+1a0d70a a 96 357
+FUNC 1a0d714 264 0 content::ChildThread::OnMessageReceived
+1a0d714 2 464 3101
+1a0d918 a 502 3101
+1bbf942 6 92 3807
+1bbf948 6 92 3807
+1bbf976 1e 95 3807
+FUNC 1bbf994 6 0 content::::CrashIntentionally
+1bbf994 6 267 3808
+1bc116c 6 156 16266
+1bc1172 1e 1484 3808
+FUNC 1bc1190 19c 0 content::::MaybeHandleDebugURL
+1bc11ee 6 309 3808
+1bc11f4 4 310 3808
+1bc11f8 10 311 3808
+FUNC 1bc2102 106 0 content::RenderFrameImpl::PrepareRenderViewForNavigation
+1bc2102 8 4007 3808
+1bc210a 2 4008 3808
+1bc210c 4 4009 3808
+1bc2110 8 4007 3808
+1bc2118 4 4008 3808
+FUNC 1bc8324 c7c 0 content::RenderFrameImpl::OnMessageReceived
+1bc8324 c 854 3808
+1bc8330 2 860 3808
+1bc85be 8 378 3264
+1bc85c6 4 378 3264
+1bc85ca 8 548 385
+1bc85d2 a 80 385
+FUNC 1bc909c 7e0 0 content::RenderFrameImpl::OnNavigate
+1bc909c c 925 3808
+1bc912c 2 932 3808
+1bc912e 20 936 3808
+1bc914e 6 933 3808
+1bc91be 12 945 3808
+FUNC 1be39f8 3ec 0 content::RendererMain
+1be39f8 12 103 3824
+1be3d0e 4 235 3824
+1be3d12 c 236 3824
+1be3d1e 6 225 3824
+1d96e7e 2 248 169
+1d96e80 2c 54 2458
+FUNC 1d96eac 17c 0 content::Start
+1d96fc6 2 48 2458
+1d96fc8 4 48 2458
+1d96fcc 2 1464 76
+1d973f8 28 822 2460
+FUNC 1d97420 fc 0 content::RunNamedProcessTypeMain
+1d97420 c 386 2460
+1d9746e e 423 2460
+1d9747c c 411 2460
+1d97488 8 417 2460
+1d974e4 38 440 2460
+FUNC 1d9751c d0 0 content::ContentMainRunnerImpl::Run
+1d9751c e 772 2460
+1d975b2 6 789 2460
+1d975b8 6 156 16266
+STACK CFI INIT 242330 7c .cfa: sp 0 + .ra: lr
+STACK CFI INIT 2423ac 1fc .cfa: sp 0 + .ra: lr
+STACK CFI 2423b0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^
+STACK CFI 2423b2 .cfa: sp 208 +
+STACK CFI INIT 25e6bc c .cfa: sp 0 + .ra: lr
+STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr
+STACK CFI INIT 25e6c8 1a .cfa: sp 0 + .ra: lr
+STACK CFI 25e6ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^
+STACK CFI 25e6cc .cfa: sp 32 +
+STACK CFI INIT 25ed20 128 .cfa: sp 0 + .ra: lr
+STACK CFI 25ed24 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^
+STACK CFI 25ed2c .cfa: sp 208 +
+STACK CFI 25ee2a .cfa: sp 20 +
+STACK CFI INIT 25ee48 140 .cfa: sp 0 + .ra: lr
+STACK CFI 25ee4c .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^
+STACK CFI INIT 25effc 24 .cfa: sp 0 + .ra: lr
+STACK CFI 25fb1c .cfa: sp 216 +
+STACK CFI 25fbac .cfa: sp 28 +
+STACK CFI INIT 25fbbc 70 .cfa: sp 0 + .ra: lr
+STACK CFI 25fbbe .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^
+STACK CFI 25fbc2 .cfa: sp 200 +
+STACK CFI 25fc1e .cfa: sp 16 +
+STACK CFI INIT 2601e2 98 .cfa: sp 0 + .ra: lr
+STACK CFI 2601e6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^
+STACK CFI 2601ec .cfa: sp 80 +
+STACK CFI 108 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^
+STACK CFI 10a .cfa: sp 24 +
+STACK CFI INIT 260840 104 .cfa: sp 0 + .ra: lr
+STACK CFI 260846 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^
+STACK CFI 26084e .cfa: sp 232 +
+STACK CFI 260930 .cfa: sp 36 +
+STACK CFI 26d0fc .cfa: sp 184 +
+STACK CFI 26d158 .cfa: sp 16 +
+STACK CFI INIT 26d168 30 .cfa: sp 0 + .ra: lr
+STACK CFI 26d16a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^
+STACK CFI 26d16c .cfa: sp 48 +
+STACK CFI 2ce518 .cfa: sp 192 +
+STACK CFI 2ce562 .cfa: sp 16 +
+STACK CFI INIT 7133b0 188 .cfa: sp 0 + .ra: lr
+STACK CFI 7133b4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^
+STACK CFI 7133ba .cfa: sp 176 +
+STACK CFI 71351e .cfa: sp 36 +
+STACK CFI INIT 22f794 58 .cfa: sp 0 + .ra: lr
+STACK CFI a497c6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^
+STACK CFI a497e0 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6
+STACK CFI INIT a497e8 26 .cfa: sp 0 + .ra: lr
+STACK CFI a497ea .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^
+STACK CFI INIT 0 46 .cfa: sp 0 + .ra: lr
+STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^
+STACK CFI 44 .cfa: sp 16 +
+STACK CFI 394494 .cfa: sp 16 +
+STACK CFI INIT 1a0d714 264 .cfa: sp 0 + .ra: lr
+STACK CFI 1a0d716 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^
+STACK CFI 1a0d71c .cfa: sp 80 +
+STACK CFI 1a0d924 .cfa: sp 20 +
+STACK CFI INIT 1a0d978 78 .cfa: sp 0 + .ra: lr
+STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr
+STACK CFI INIT 1bbf994 6 .cfa: sp 0 + .ra: lr
+STACK CFI INIT 1bc1190 19c .cfa: sp 0 + .ra: lr
+STACK CFI 1bc1194 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^
+STACK CFI 1bc119e .cfa: sp 184 +
+STACK CFI 1bc1338 .cfa: sp 112 +
+STACK CFI INIT 1bc2102 106 .cfa: sp 0 + .ra: lr
+STACK CFI 1bc2106 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^
+STACK CFI 1bc210a .cfa: sp 56 +
+STACK CFI 1bc2204 .cfa: sp 28 +
+STACK CFI INIT 1bc2208 6c .cfa: sp 0 + .ra: lr
+STACK CFI INIT 1bc8324 c7c .cfa: sp 0 + .ra: lr
+STACK CFI 1bc8328 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^
+STACK CFI 1bc8338 .cfa: sp 1216 +
+STACK CFI c0 .cfa: sp 24 +
+STACK CFI INIT 1bc909c 7e0 .cfa: sp 0 + .ra: lr
+STACK CFI 1bc90a4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^
+STACK CFI 1bc90b2 .cfa: sp 560 +
+STACK CFI 108 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^
+STACK CFI 10a .cfa: sp 24 +
+STACK CFI INIT 28a980 28 .cfa: sp 0 + .ra: lr
+STACK CFI 28a982 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^
+STACK CFI INIT 1be39f8 3ec .cfa: sp 0 + .ra: lr
+STACK CFI 1be39fc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^
+STACK CFI 1be3a0a .cfa: sp 664 +
+STACK CFI 1be3d78 .cfa: sp 36 +
+STACK CFI 1d96e8e .cfa: sp 20 +
+STACK CFI INIT 1d96eac 17c .cfa: sp 0 + .ra: lr
+STACK CFI 1d96eb2 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^
+STACK CFI 1d96ebc .cfa: sp 280 +
+STACK CFI 1d96ffa .cfa: sp 28 +
+STACK CFI INIT 22f794 58 .cfa: sp 0 + .ra: lr
+STACK CFI 231cb6 .cfa: sp 28 +
+STACK CFI INIT 1d97420 fc .cfa: sp 0 + .ra: lr
+STACK CFI 1d97424 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^
+STACK CFI 1d97432 .cfa: sp 200 +
+STACK CFI 1d974f2 .cfa: sp 32 +
+STACK CFI INIT 1d9751c d0 .cfa: sp 0 + .ra: lr
+STACK CFI 1d97522 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^
+STACK CFI 1d9752a .cfa: sp 232 +