diff options
author | benchan@chromium.org <benchan@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2012-01-19 07:14:51 +0000 |
---|---|---|
committer | benchan@chromium.org <benchan@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2012-01-19 07:14:51 +0000 |
commit | 30566abed8d95b752f31f67fde94c0ae0a1502d2 (patch) | |
tree | 90f98f074cebf21102ad8f8717a2e70e9f4438a9 /src/client/linux/minidump_writer/linux_dumper.h | |
parent | Skip ElfCoreDumpTest.ValidCoreFile test if no core dump is generated. (diff) | |
download | breakpad-30566abed8d95b752f31f67fde94c0ae0a1502d2.tar.xz |
Implement core dump to minidump conversion.
This patch is part of a bigger patch that helps merging the breakpad code
with the modified version in Chromium OS.
Specifically, this patch makes the following changes:
1. Turn the LinuxDumper class into a base class and move ptrace related
code into a new derived class, LinuxPtraceDumper.
2. Add a LinuxCoreDumper class, which is derived from LinuxDumper, to
extract information from a crashed process via a core dump file instead
of ptrace.
3. Add a WriteMinidumpFromCore function to
src/client/linux/minidump_writer/minidump_writer.h,
which uses LinuxCoreDumper to extract information from a core dump file.
4. Add a core2md utility, which simply wraps WriteMinidumpFromCore, for
converting a core dump to a minidump.
BUG=455
TEST=Tested the following:
1. Build on 32-bit and 64-bit Linux with gcc 4.4.3 and gcc 4.6.
2. Build on Mac OS X 10.6.8 with gcc 4.2 and clang 3.0 (with latest gmock).
3. All unit tests pass.
4. Run Chromium OS tests to test core2md.
Review URL: http://breakpad.appspot.com/343001
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@905 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/linux/minidump_writer/linux_dumper.h')
-rw-r--r-- | src/client/linux/minidump_writer/linux_dumper.h | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/src/client/linux/minidump_writer/linux_dumper.h b/src/client/linux/minidump_writer/linux_dumper.h index b0e4f855..45779699 100644 --- a/src/client/linux/minidump_writer/linux_dumper.h +++ b/src/client/linux/minidump_writer/linux_dumper.h @@ -27,6 +27,14 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// linux_dumper.h: Define the google_breakpad::LinuxDumper class, which +// is a base class for extracting information of a crashed process. It +// was originally a complete implementation using the ptrace API, but +// has been refactored to allow derived implementations supporting both +// ptrace and core dump. A portion of the original implementation is now +// in google_breakpad::LinuxPtraceDumper (see linux_ptrace_dumper.h for +// details). + #ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_ #define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_ @@ -121,15 +129,18 @@ class LinuxDumper { virtual ~LinuxDumper(); // Parse the data for |threads| and |mappings|. - bool Init(); + virtual bool Init(); + + // Return true if the dumper performs a post-mortem dump. + virtual bool IsPostMortem() const = 0; // Suspend/resume all threads in the given process. - bool ThreadsSuspend(); - bool ThreadsResume(); + virtual bool ThreadsSuspend() = 0; + virtual bool ThreadsResume() = 0; // Read information about the |index|-th thread of |threads_|. // Returns true on success. One must have called |ThreadsSuspend| first. - virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info); + virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info) = 0; // These are only valid after a call to |Init|. const wasteful_vector<pid_t> &threads() { return threads_; } @@ -146,13 +157,14 @@ class LinuxDumper { // Copy content of |length| bytes from a given process |child|, // starting from |src|, into |dest|. - void CopyFromProcess(void* dest, pid_t child, const void* src, - size_t length); + virtual void CopyFromProcess(void* dest, pid_t child, const void* src, + size_t length) = 0; - // Builds a proc path for a certain pid for a node. path is a - // character array that is overwritten, and node is the final node - // without any slashes. - void BuildProcPath(char* path, pid_t pid, const char* node) const; + // Builds a proc path for a certain pid for a node (/proc/<pid>/<node>). + // |path| is a character array of at least NAME_MAX bytes to return the + // result.|node| is the final node without any slashes. Returns true on + // success. + virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const = 0; // Generate a File ID from the .text section of a mapped entry. // If not a member, mapping_id is ignored. @@ -179,9 +191,10 @@ class LinuxDumper { pid_t crash_thread() const { return crash_thread_; } void set_crash_thread(pid_t crash_thread) { crash_thread_ = crash_thread; } - private: - bool EnumerateMappings(); - bool EnumerateThreads(); + protected: + virtual bool EnumerateMappings(); + + virtual bool EnumerateThreads() = 0; // For the case where a running program has been deleted, it'll show up in // /proc/pid/maps as "/path/to/program (deleted)". If this is the case, then @@ -208,9 +221,11 @@ class LinuxDumper { mutable PageAllocator allocator_; - bool threads_suspended_; - wasteful_vector<pid_t> threads_; // the ids of all the threads - wasteful_vector<MappingInfo*> mappings_; // info from /proc/<pid>/maps + // IDs of all the threads. + wasteful_vector<pid_t> threads_; + + // Info from /proc/<pid>/maps. + wasteful_vector<MappingInfo*> mappings_; }; } // namespace google_breakpad |