1 // Copyright (c) 2012, Google Inc. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above 11 // copyright notice, this list of conditions and the following disclaimer 12 // in the documentation and/or other materials provided with the 13 // distribution. 14 // * Neither the name of Google Inc. nor the names of its 15 // contributors may be used to endorse or promote products derived from 16 // this software without specific prior written permission. 17 // 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30 // linux_core_dumper.h: Define the google_breakpad::LinuxCoreDumper 31 // class, which is derived from google_breakpad::LinuxDumper to extract 32 // information from a crashed process via its core dump and proc files. 33 34 #ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_CORE_DUMPER_H_ 35 #define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_CORE_DUMPER_H_ 36 37 #include "client/linux/minidump_writer/linux_dumper.h" 38 #include "common/linux/elf_core_dump.h" 39 #include "common/linux/memory_mapped_file.h" 40 41 namespace google_breakpad { 42 43 class LinuxCoreDumper : public LinuxDumper { 44 public: 45 // Constructs a dumper for extracting information of a given process 46 // with a process ID of |pid| via its core dump file at |core_path| and 47 // its proc files at |procfs_path|. If |procfs_path| is a copy of 48 // /proc/<pid>, it should contain the following files: 49 // auxv, cmdline, environ, exe, maps, status 50 // See LinuxDumper for the purpose of |root_prefix|. 51 LinuxCoreDumper(pid_t pid, const char* core_path, const char* procfs_path, 52 const char* root_prefix = ""); 53 54 // Implements LinuxDumper::BuildProcPath(). 55 // Builds a proc path for a certain pid for a node (/proc/<pid>/<node>). 56 // |path| is a character array of at least NAME_MAX bytes to return the 57 // result.|node| is the final node without any slashes. Return true on 58 // success. 59 // 60 // As this dumper performs a post-mortem dump and makes use of a copy 61 // of the proc files of the crashed process, this derived method does 62 // not actually make use of |pid| and always returns a subpath of 63 // |procfs_path_| regardless of whether |pid| corresponds to the main 64 // process or a thread of the process, i.e. assuming both the main process 65 // and its threads have the following proc files with the same content: 66 // auxv, cmdline, environ, exe, maps, status 67 virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const; 68 69 // Implements LinuxDumper::CopyFromProcess(). 70 // Copies content of |length| bytes from a given process |child|, 71 // starting from |src|, into |dest|. This method extracts the content 72 // the core dump and fills |dest| with a sequence of marker bytes 73 // if the expected data is not found in the core dump. Returns true if 74 // the expected data is found in the core dump. 75 virtual bool CopyFromProcess(void* dest, pid_t child, const void* src, 76 size_t length); 77 78 // Implements LinuxDumper::GetThreadInfoByIndex(). 79 // Reads information about the |index|-th thread of |threads_|. 80 // Returns true on success. One must have called |ThreadsSuspend| first. 81 virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info); 82 83 // Implements LinuxDumper::IsPostMortem(). 84 // Always returns true to indicate that this dumper performs a 85 // post-mortem dump of a crashed process via a core dump file. 86 virtual bool IsPostMortem() const; 87 88 // Implements LinuxDumper::ThreadsSuspend(). 89 // As the dumper performs a post-mortem dump via a core dump file, 90 // there is no threads to suspend. This method does nothing and 91 // always returns true. 92 virtual bool ThreadsSuspend(); 93 94 // Implements LinuxDumper::ThreadsResume(). 95 // As the dumper performs a post-mortem dump via a core dump file, 96 // there is no threads to resume. This method does nothing and 97 // always returns true. 98 virtual bool ThreadsResume(); 99 100 protected: 101 // Implements LinuxDumper::EnumerateThreads(). 102 // Enumerates all threads of the given process into |threads_|. 103 virtual bool EnumerateThreads(); 104 105 private: 106 // Path of the core dump file. 107 const char* core_path_; 108 109 // Path of the directory containing the proc files of the given process, 110 // which is usually a copy of /proc/<pid>. 111 const char* procfs_path_; 112 113 // Memory-mapped core dump file at |core_path_|. 114 MemoryMappedFile mapped_core_file_; 115 116 // Content of the core dump file. 117 ElfCoreDump core_; 118 119 // Thread info found in the core dump file. 120 wasteful_vector<ThreadInfo> thread_infos_; 121 }; 122 123 } // namespace google_breakpad 124 125 #endif // CLIENT_LINUX_HANDLER_LINUX_CORE_DUMPER_H_ 126