14fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// Copyright (c) 2012, Google Inc. 24fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// All rights reserved. 34fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// 44fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// Redistribution and use in source and binary forms, with or without 54fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// modification, are permitted provided that the following conditions are 64fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// met: 74fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// 84fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// * Redistributions of source code must retain the above copyright 94fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// notice, this list of conditions and the following disclaimer. 104fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// * Redistributions in binary form must reproduce the above 114fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// copyright notice, this list of conditions and the following disclaimer 124fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// in the documentation and/or other materials provided with the 134fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// distribution. 144fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// * Neither the name of Google Inc. nor the names of its 154fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// contributors may be used to endorse or promote products derived from 164fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// this software without specific prior written permission. 174fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// 184fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 194fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 204fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 214fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 224fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 234fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 244fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 254fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 264fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 274fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 284fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 294fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 304fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// linux_ptrace_dumper.h: Define the google_breakpad::LinuxPtraceDumper 314fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// class, which is derived from google_breakpad::LinuxDumper to extract 324fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// information from a crashed process via ptrace. 334fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org// This class was originally splitted from google_breakpad::LinuxDumper. 344fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 354fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_PTRACE_DUMPER_H_ 364fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_PTRACE_DUMPER_H_ 374fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 384fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org#include "client/linux/minidump_writer/linux_dumper.h" 394fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 404fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.orgnamespace google_breakpad { 414fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 424fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.orgclass LinuxPtraceDumper : public LinuxDumper { 434fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org public: 444fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Constructs a dumper for extracting information of a given process 454fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // with a process ID of |pid|. 464fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org explicit LinuxPtraceDumper(pid_t pid); 474fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 484fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Implements LinuxDumper::BuildProcPath(). 494fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Builds a proc path for a certain pid for a node (/proc/<pid>/<node>). 504fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // |path| is a character array of at least NAME_MAX bytes to return the 514fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // result. |node| is the final node without any slashes. Returns true on 524fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // success. 534fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const; 544fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 554fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Implements LinuxDumper::CopyFromProcess(). 564fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Copies content of |length| bytes from a given process |child|, 574fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // starting from |src|, into |dest|. This method uses ptrace to extract 58e0aa94bfb6682a04f824b64d064fbb58ac5343c7benchan@chromium.org // the content from the target process. Always returns true. 59e0aa94bfb6682a04f824b64d064fbb58ac5343c7benchan@chromium.org virtual bool CopyFromProcess(void* dest, pid_t child, const void* src, 604fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org size_t length); 614fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 624fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Implements LinuxDumper::GetThreadInfoByIndex(). 634fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Reads information about the |index|-th thread of |threads_|. 644fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Returns true on success. One must have called |ThreadsSuspend| first. 654fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info); 664fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 674fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Implements LinuxDumper::IsPostMortem(). 684fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Always returns false to indicate this dumper performs a dump of 694fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // a crashed process via ptrace. 704fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org virtual bool IsPostMortem() const; 714fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 724fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Implements LinuxDumper::ThreadsSuspend(). 734fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Suspends all threads in the given process. Returns true on success. 744fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org virtual bool ThreadsSuspend(); 754fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 764fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Implements LinuxDumper::ThreadsResume(). 774fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Resumes all threads in the given process. Returns true on success. 784fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org virtual bool ThreadsResume(); 794fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 804fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org protected: 814fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Implements LinuxDumper::EnumerateThreads(). 824fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Enumerates all threads of the given process into |threads_|. 834fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org virtual bool EnumerateThreads(); 844fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 854fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org private: 864fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org // Set to true if all threads of the crashed process are suspended. 874fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org bool threads_suspended_; 884fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org}; 894fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 904fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org} // namespace google_breakpad 914fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org 924fa638a7ecb6ab042664300767614308dbc147bbbenchan@chromium.org#endif // CLIENT_LINUX_HANDLER_LINUX_PTRACE_DUMPER_H_ 93