Home | History | Annotate | Download | only in processor
      1 // Copyright (c) 2010 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 // minidump.h: A minidump reader.
     31 //
     32 // The basic structure of this module tracks the structure of the minidump
     33 // file itself.  At the top level, a minidump file is represented by a
     34 // Minidump object.  Like most other classes in this module, Minidump
     35 // provides a Read method that initializes the object with information from
     36 // the file.  Most of the classes in this file are wrappers around the
     37 // "raw" structures found in the minidump file itself, and defined in
     38 // minidump_format.h.  For example, each thread is represented by a
     39 // MinidumpThread object, whose parameters are specified in an MDRawThread
     40 // structure.  A properly byte-swapped MDRawThread can be obtained from a
     41 // MinidumpThread easily by calling its thread() method.
     42 //
     43 // Most of the module lazily reads only the portion of the minidump file
     44 // necessary to fulfill the user's request.  Calling Minidump::Read
     45 // only reads the minidump's directory.  The thread list is not read until
     46 // it is needed, and even once it's read, the memory regions for each
     47 // thread's stack aren't read until they're needed.  This strategy avoids
     48 // unnecessary file input, and allocating memory for data in which the user
     49 // has no interest.  Note that although memory allocations for a typical
     50 // minidump file are not particularly large, it is possible for legitimate
     51 // minidumps to be sizable.  A full-memory minidump, for example, contains
     52 // a snapshot of the entire mapped memory space.  Even a normal minidump,
     53 // with stack memory only, can be large if, for example, the dump was
     54 // generated in response to a crash that occurred due to an infinite-
     55 // recursion bug that caused the stack's limits to be exceeded.  Finally,
     56 // some users of this library will unfortunately find themselves in the
     57 // position of having to process potentially-hostile minidumps that might
     58 // attempt to cause problems by forcing the minidump processor to over-
     59 // allocate memory.
     60 //
     61 // Memory management in this module is based on a strict
     62 // you-don't-own-anything policy.  The only object owned by the user is
     63 // the top-level Minidump object, the creation and destruction of which
     64 // must be the user's own responsibility.  All other objects obtained
     65 // through interaction with this module are ultimately owned by the
     66 // Minidump object, and will be freed upon the Minidump object's destruction.
     67 // Because memory regions can potentially involve large allocations, a
     68 // FreeMemory method is provided by MinidumpMemoryRegion, allowing the user
     69 // to release data when it is no longer needed.  Use of this method is
     70 // optional but recommended.  If freed data is later required, it will
     71 // be read back in from the minidump file again.
     72 //
     73 // There is one exception to this memory management policy:
     74 // Minidump::ReadString will return a string object to the user, and the user
     75 // is responsible for its deletion.
     76 //
     77 // Author: Mark Mentovai
     78 
     79 #ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__
     80 #define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__
     81 
     82 #ifndef _WIN32
     83 #include <unistd.h>
     84 #endif
     85 
     86 #include <iostream>
     87 #include <map>
     88 #include <string>
     89 #include <vector>
     90 
     91 #include "common/using_std_string.h"
     92 #include "google_breakpad/processor/code_module.h"
     93 #include "google_breakpad/processor/code_modules.h"
     94 #include "google_breakpad/processor/dump_context.h"
     95 #include "google_breakpad/processor/dump_object.h"
     96 #include "google_breakpad/processor/memory_region.h"
     97 
     98 
     99 namespace google_breakpad {
    100 
    101 
    102 using std::map;
    103 using std::vector;
    104 
    105 
    106 class Minidump;
    107 template<typename AddressType, typename EntryType> class RangeMap;
    108 
    109 
    110 // MinidumpObject is the base of all Minidump* objects except for Minidump
    111 // itself.
    112 class MinidumpObject : public DumpObject {
    113  public:
    114   virtual ~MinidumpObject() {}
    115 
    116  protected:
    117   explicit MinidumpObject(Minidump* minidump);
    118 
    119   // Refers to the Minidump object that is the ultimate parent of this
    120   // Some MinidumpObjects are owned by other MinidumpObjects, but at the
    121   // root of the ownership tree is always a Minidump.  The Minidump object
    122   // is kept here for access to its seeking and reading facilities, and
    123   // for access to data about the minidump file itself, such as whether
    124   // it should be byte-swapped.
    125   Minidump* minidump_;
    126 };
    127 
    128 
    129 // This class exists primarily to provide a virtual destructor in a base
    130 // class common to all objects that might be stored in
    131 // Minidump::mStreamObjects.  Some object types will never be stored in
    132 // Minidump::mStreamObjects, but are represented as streams and adhere to the
    133 // same interface, and may be derived from this class.
    134 class MinidumpStream : public MinidumpObject {
    135  public:
    136   virtual ~MinidumpStream() {}
    137 
    138  protected:
    139   explicit MinidumpStream(Minidump* minidump);
    140 
    141  private:
    142   // Populate (and validate) the MinidumpStream.  minidump_ is expected
    143   // to be positioned at the beginning of the stream, so that the next
    144   // read from the minidump will be at the beginning of the stream.
    145   // expected_size should be set to the stream's length as contained in
    146   // the MDRawDirectory record or other identifying record.  A class
    147   // that implements MinidumpStream can compare expected_size to a
    148   // known size as an integrity check.
    149   virtual bool Read(uint32_t expected_size) = 0;
    150 };
    151 
    152 
    153 // MinidumpContext carries a CPU-specific MDRawContext structure, which
    154 // contains CPU context such as register states.  Each thread has its
    155 // own context, and the exception record, if present, also has its own
    156 // context.  Note that if the exception record is present, the context it
    157 // refers to is probably what the user wants to use for the exception
    158 // thread, instead of that thread's own context.  The exception thread's
    159 // context (as opposed to the exception record's context) will contain
    160 // context for the exception handler (which performs minidump generation),
    161 // and not the context that caused the exception (which is probably what the
    162 // user wants).
    163 class MinidumpContext : public DumpContext {
    164  public:
    165   virtual ~MinidumpContext();
    166 
    167  protected:
    168   explicit MinidumpContext(Minidump* minidump);
    169 
    170  private:
    171   friend class MinidumpThread;
    172   friend class MinidumpException;
    173 
    174   bool Read(uint32_t expected_size);
    175 
    176   // If the minidump contains a SYSTEM_INFO_STREAM, makes sure that the
    177   // system info stream gives an appropriate CPU type matching the context
    178   // CPU type in context_cpu_type.  Returns false if the CPU type does not
    179   // match.  Returns true if the CPU type matches or if the minidump does
    180   // not contain a system info stream.
    181   bool CheckAgainstSystemInfo(uint32_t context_cpu_type);
    182 
    183   // Refers to the Minidump object that is the ultimate parent of this
    184   // Some MinidumpObjects are owned by other MinidumpObjects, but at the
    185   // root of the ownership tree is always a Minidump.  The Minidump object
    186   // is kept here for access to its seeking and reading facilities, and
    187   // for access to data about the minidump file itself, such as whether
    188   // it should be byte-swapped.
    189   Minidump* minidump_;
    190 };
    191 
    192 
    193 // MinidumpMemoryRegion does not wrap any MDRaw structure, and only contains
    194 // a reference to an MDMemoryDescriptor.  This object is intended to wrap
    195 // portions of a minidump file that contain memory dumps.  In normal
    196 // minidumps, each MinidumpThread owns a MinidumpMemoryRegion corresponding
    197 // to the thread's stack memory.  MinidumpMemoryList also gives access to
    198 // memory regions in its list as MinidumpMemoryRegions.  This class
    199 // adheres to MemoryRegion so that it may be used as a data provider to
    200 // the Stackwalker family of classes.
    201 class MinidumpMemoryRegion : public MinidumpObject,
    202                              public MemoryRegion {
    203  public:
    204   virtual ~MinidumpMemoryRegion();
    205 
    206   static void set_max_bytes(uint32_t max_bytes) { max_bytes_ = max_bytes; }
    207   static uint32_t max_bytes() { return max_bytes_; }
    208 
    209   // Returns a pointer to the base of the memory region.  Returns the
    210   // cached value if available, otherwise, reads the minidump file and
    211   // caches the memory region.
    212   const uint8_t* GetMemory() const;
    213 
    214   // The address of the base of the memory region.
    215   uint64_t GetBase() const;
    216 
    217   // The size, in bytes, of the memory region.
    218   uint32_t GetSize() const;
    219 
    220   // Frees the cached memory region, if cached.
    221   void FreeMemory();
    222 
    223   // Obtains the value of memory at the pointer specified by address.
    224   bool GetMemoryAtAddress(uint64_t address, uint8_t*  value) const;
    225   bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const;
    226   bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const;
    227   bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const;
    228 
    229   // Print a human-readable representation of the object to stdout.
    230   void Print() const;
    231 
    232  protected:
    233   explicit MinidumpMemoryRegion(Minidump* minidump);
    234 
    235  private:
    236   friend class MinidumpThread;
    237   friend class MinidumpMemoryList;
    238 
    239   // Identify the base address and size of the memory region, and the
    240   // location it may be found in the minidump file.
    241   void SetDescriptor(MDMemoryDescriptor* descriptor);
    242 
    243   // Implementation for GetMemoryAtAddress
    244   template<typename T> bool GetMemoryAtAddressInternal(uint64_t address,
    245                                                        T*        value) const;
    246 
    247   // The largest memory region that will be read from a minidump.  The
    248   // default is 1MB.
    249   static uint32_t max_bytes_;
    250 
    251   // Base address and size of the memory region, and its position in the
    252   // minidump file.
    253   MDMemoryDescriptor* descriptor_;
    254 
    255   // Cached memory.
    256   mutable vector<uint8_t>* memory_;
    257 };
    258 
    259 
    260 // MinidumpThread contains information about a thread of execution,
    261 // including a snapshot of the thread's stack and CPU context.  For
    262 // the thread that caused an exception, the context carried by
    263 // MinidumpException is probably desired instead of the CPU context
    264 // provided here.
    265 // Note that a MinidumpThread may be valid() even if it does not
    266 // contain a memory region or context.
    267 class MinidumpThread : public MinidumpObject {
    268  public:
    269   virtual ~MinidumpThread();
    270 
    271   const MDRawThread* thread() const { return valid_ ? &thread_ : NULL; }
    272   // GetMemory may return NULL even if the MinidumpThread is valid,
    273   // if the thread memory cannot be read.
    274   virtual MinidumpMemoryRegion* GetMemory();
    275   // GetContext may return NULL even if the MinidumpThread is valid.
    276   virtual MinidumpContext* GetContext();
    277 
    278   // The thread ID is used to determine if a thread is the exception thread,
    279   // so a special getter is provided to retrieve this data from the
    280   // MDRawThread structure.  Returns false if the thread ID cannot be
    281   // determined.
    282   virtual bool GetThreadID(uint32_t *thread_id) const;
    283 
    284   // Print a human-readable representation of the object to stdout.
    285   void Print();
    286 
    287   // Returns the start address of the thread stack memory region.  Returns 0 if
    288   // MinidumpThread is invalid.  Note that this method can be called even when
    289   // the thread memory cannot be read and GetMemory returns NULL.
    290   virtual uint64_t GetStartOfStackMemoryRange() const;
    291 
    292  protected:
    293   explicit MinidumpThread(Minidump* minidump);
    294 
    295  private:
    296   // These objects are managed by MinidumpThreadList.
    297   friend class MinidumpThreadList;
    298 
    299   // This works like MinidumpStream::Read, but is driven by
    300   // MinidumpThreadList.  No size checking is done, because
    301   // MinidumpThreadList handles that directly.
    302   bool Read();
    303 
    304   MDRawThread           thread_;
    305   MinidumpMemoryRegion* memory_;
    306   MinidumpContext*      context_;
    307 };
    308 
    309 
    310 // MinidumpThreadList contains all of the threads (as MinidumpThreads) in
    311 // a process.
    312 class MinidumpThreadList : public MinidumpStream {
    313  public:
    314   virtual ~MinidumpThreadList();
    315 
    316   static void set_max_threads(uint32_t max_threads) {
    317     max_threads_ = max_threads;
    318   }
    319   static uint32_t max_threads() { return max_threads_; }
    320 
    321   virtual unsigned int thread_count() const {
    322     return valid_ ? thread_count_ : 0;
    323   }
    324 
    325   // Sequential access to threads.
    326   virtual MinidumpThread* GetThreadAtIndex(unsigned int index) const;
    327 
    328   // Random access to threads.
    329   MinidumpThread* GetThreadByID(uint32_t thread_id);
    330 
    331   // Print a human-readable representation of the object to stdout.
    332   void Print();
    333 
    334  protected:
    335   explicit MinidumpThreadList(Minidump* aMinidump);
    336 
    337  private:
    338   friend class Minidump;
    339 
    340   typedef map<uint32_t, MinidumpThread*> IDToThreadMap;
    341   typedef vector<MinidumpThread> MinidumpThreads;
    342 
    343   static const uint32_t kStreamType = MD_THREAD_LIST_STREAM;
    344 
    345   bool Read(uint32_t aExpectedSize);
    346 
    347   // The largest number of threads that will be read from a minidump.  The
    348   // default is 256.
    349   static uint32_t max_threads_;
    350 
    351   // Access to threads using the thread ID as the key.
    352   IDToThreadMap    id_to_thread_map_;
    353 
    354   // The list of threads.
    355   MinidumpThreads* threads_;
    356   uint32_t        thread_count_;
    357 };
    358 
    359 
    360 // MinidumpModule wraps MDRawModule, which contains information about loaded
    361 // code modules.  Access is provided to various data referenced indirectly
    362 // by MDRawModule, such as the module's name and a specification for where
    363 // to locate debugging information for the module.
    364 class MinidumpModule : public MinidumpObject,
    365                        public CodeModule {
    366  public:
    367   virtual ~MinidumpModule();
    368 
    369   static void set_max_cv_bytes(uint32_t max_cv_bytes) {
    370     max_cv_bytes_ = max_cv_bytes;
    371   }
    372   static uint32_t max_cv_bytes() { return max_cv_bytes_; }
    373 
    374   static void set_max_misc_bytes(uint32_t max_misc_bytes) {
    375     max_misc_bytes_ = max_misc_bytes;
    376   }
    377   static uint32_t max_misc_bytes() { return max_misc_bytes_; }
    378 
    379   const MDRawModule* module() const { return valid_ ? &module_ : NULL; }
    380 
    381   // CodeModule implementation
    382   virtual uint64_t base_address() const {
    383     return valid_ ? module_.base_of_image : static_cast<uint64_t>(-1);
    384   }
    385   virtual uint64_t size() const { return valid_ ? module_.size_of_image : 0; }
    386   virtual string code_file() const;
    387   virtual string code_identifier() const;
    388   virtual string debug_file() const;
    389   virtual string debug_identifier() const;
    390   virtual string version() const;
    391   virtual const CodeModule* Copy() const;
    392 
    393   // The CodeView record, which contains information to locate the module's
    394   // debugging information (pdb).  This is returned as uint8_t* because
    395   // the data can be of types MDCVInfoPDB20* or MDCVInfoPDB70*, or it may be
    396   // of a type unknown to Breakpad, in which case the raw data will still be
    397   // returned but no byte-swapping will have been performed.  Check the
    398   // record's signature in the first four bytes to differentiate between
    399   // the various types.  Current toolchains generate modules which carry
    400   // MDCVInfoPDB70 by default.  Returns a pointer to the CodeView record on
    401   // success, and NULL on failure.  On success, the optional |size| argument
    402   // is set to the size of the CodeView record.
    403   const uint8_t* GetCVRecord(uint32_t* size);
    404 
    405   // The miscellaneous debug record, which is obsolete.  Current toolchains
    406   // do not generate this type of debugging information (dbg), and this
    407   // field is not expected to be present.  Returns a pointer to the debugging
    408   // record on success, and NULL on failure.  On success, the optional |size|
    409   // argument is set to the size of the debugging record.
    410   const MDImageDebugMisc* GetMiscRecord(uint32_t* size);
    411 
    412   // Print a human-readable representation of the object to stdout.
    413   void Print();
    414 
    415  private:
    416   // These objects are managed by MinidumpModuleList.
    417   friend class MinidumpModuleList;
    418 
    419   explicit MinidumpModule(Minidump* minidump);
    420 
    421   // This works like MinidumpStream::Read, but is driven by
    422   // MinidumpModuleList.  No size checking is done, because
    423   // MinidumpModuleList handles that directly.
    424   bool Read();
    425 
    426   // Reads indirectly-referenced data, including the module name, CodeView
    427   // record, and miscellaneous debugging record.  This is necessary to allow
    428   // MinidumpModuleList to fully construct MinidumpModule objects without
    429   // requiring seeks to read a contiguous set of MinidumpModule objects.
    430   // All auxiliary data should be available when Read is called, in order to
    431   // allow the CodeModule getters to be const methods.
    432   bool ReadAuxiliaryData();
    433 
    434   // The largest number of bytes that will be read from a minidump for a
    435   // CodeView record or miscellaneous debugging record, respectively.  The
    436   // default for each is 1024.
    437   static uint32_t max_cv_bytes_;
    438   static uint32_t max_misc_bytes_;
    439 
    440   // True after a successful Read.  This is different from valid_, which is
    441   // not set true until ReadAuxiliaryData also completes successfully.
    442   // module_valid_ is only used by ReadAuxiliaryData and the functions it
    443   // calls to determine whether the object is ready for auxiliary data to
    444   // be read.
    445   bool              module_valid_;
    446 
    447   // True if debug info was read from the module.  Certain modules
    448   // may contain debug records in formats we don't support,
    449   // so we can just set this to false to ignore them.
    450   bool              has_debug_info_;
    451 
    452   MDRawModule       module_;
    453 
    454   // Cached module name.
    455   const string*     name_;
    456 
    457   // Cached CodeView record - this is MDCVInfoPDB20 or (likely)
    458   // MDCVInfoPDB70, or possibly something else entirely.  Stored as a uint8_t
    459   // because the structure contains a variable-sized string and its exact
    460   // size cannot be known until it is processed.
    461   vector<uint8_t>* cv_record_;
    462 
    463   // If cv_record_ is present, cv_record_signature_ contains a copy of the
    464   // CodeView record's first four bytes, for ease of determinining the
    465   // type of structure that cv_record_ contains.
    466   uint32_t cv_record_signature_;
    467 
    468   // Cached MDImageDebugMisc (usually not present), stored as uint8_t
    469   // because the structure contains a variable-sized string and its exact
    470   // size cannot be known until it is processed.
    471   vector<uint8_t>* misc_record_;
    472 };
    473 
    474 
    475 // MinidumpModuleList contains all of the loaded code modules for a process
    476 // in the form of MinidumpModules.  It maintains a map of these modules
    477 // so that it may easily provide a code module corresponding to a specific
    478 // address.
    479 class MinidumpModuleList : public MinidumpStream,
    480                            public CodeModules {
    481  public:
    482   virtual ~MinidumpModuleList();
    483 
    484   static void set_max_modules(uint32_t max_modules) {
    485     max_modules_ = max_modules;
    486   }
    487   static uint32_t max_modules() { return max_modules_; }
    488 
    489   // CodeModules implementation.
    490   virtual unsigned int module_count() const {
    491     return valid_ ? module_count_ : 0;
    492   }
    493   virtual const MinidumpModule* GetModuleForAddress(uint64_t address) const;
    494   virtual const MinidumpModule* GetMainModule() const;
    495   virtual const MinidumpModule* GetModuleAtSequence(
    496       unsigned int sequence) const;
    497   virtual const MinidumpModule* GetModuleAtIndex(unsigned int index) const;
    498   virtual const CodeModules* Copy() const;
    499 
    500   // Print a human-readable representation of the object to stdout.
    501   void Print();
    502 
    503  protected:
    504   explicit MinidumpModuleList(Minidump* minidump);
    505 
    506  private:
    507   friend class Minidump;
    508 
    509   typedef vector<MinidumpModule> MinidumpModules;
    510 
    511   static const uint32_t kStreamType = MD_MODULE_LIST_STREAM;
    512 
    513   bool Read(uint32_t expected_size);
    514 
    515   // The largest number of modules that will be read from a minidump.  The
    516   // default is 1024.
    517   static uint32_t max_modules_;
    518 
    519   // Access to modules using addresses as the key.
    520   RangeMap<uint64_t, unsigned int> *range_map_;
    521 
    522   MinidumpModules *modules_;
    523   uint32_t module_count_;
    524 };
    525 
    526 
    527 // MinidumpMemoryList corresponds to a minidump's MEMORY_LIST_STREAM stream,
    528 // which references the snapshots of all of the memory regions contained
    529 // within the minidump.  For a normal minidump, this includes stack memory
    530 // (also referenced by each MinidumpThread, in fact, the MDMemoryDescriptors
    531 // here and in MDRawThread both point to exactly the same data in a
    532 // minidump file, conserving space), as well as a 256-byte snapshot of memory
    533 // surrounding the instruction pointer in the case of an exception.  Other
    534 // types of minidumps may contain significantly more memory regions.  Full-
    535 // memory minidumps contain all of a process' mapped memory.
    536 class MinidumpMemoryList : public MinidumpStream {
    537  public:
    538   virtual ~MinidumpMemoryList();
    539 
    540   static void set_max_regions(uint32_t max_regions) {
    541     max_regions_ = max_regions;
    542   }
    543   static uint32_t max_regions() { return max_regions_; }
    544 
    545   unsigned int region_count() const { return valid_ ? region_count_ : 0; }
    546 
    547   // Sequential access to memory regions.
    548   MinidumpMemoryRegion* GetMemoryRegionAtIndex(unsigned int index);
    549 
    550   // Random access to memory regions.  Returns the region encompassing
    551   // the address identified by address.
    552   virtual MinidumpMemoryRegion* GetMemoryRegionForAddress(uint64_t address);
    553 
    554   // Print a human-readable representation of the object to stdout.
    555   void Print();
    556 
    557  private:
    558   friend class Minidump;
    559   friend class MockMinidumpMemoryList;
    560 
    561   typedef vector<MDMemoryDescriptor>   MemoryDescriptors;
    562   typedef vector<MinidumpMemoryRegion> MemoryRegions;
    563 
    564   static const uint32_t kStreamType = MD_MEMORY_LIST_STREAM;
    565 
    566   explicit MinidumpMemoryList(Minidump* minidump);
    567 
    568   bool Read(uint32_t expected_size);
    569 
    570   // The largest number of memory regions that will be read from a minidump.
    571   // The default is 256.
    572   static uint32_t max_regions_;
    573 
    574   // Access to memory regions using addresses as the key.
    575   RangeMap<uint64_t, unsigned int> *range_map_;
    576 
    577   // The list of descriptors.  This is maintained separately from the list
    578   // of regions, because MemoryRegion doesn't own its MemoryDescriptor, it
    579   // maintains a pointer to it.  descriptors_ provides the storage for this
    580   // purpose.
    581   MemoryDescriptors *descriptors_;
    582 
    583   // The list of regions.
    584   MemoryRegions *regions_;
    585   uint32_t region_count_;
    586 };
    587 
    588 
    589 // MinidumpException wraps MDRawExceptionStream, which contains information
    590 // about the exception that caused the minidump to be generated, if the
    591 // minidump was generated in an exception handler called as a result of an
    592 // exception.  It also provides access to a MinidumpContext object, which
    593 // contains the CPU context for the exception thread at the time the exception
    594 // occurred.
    595 class MinidumpException : public MinidumpStream {
    596  public:
    597   virtual ~MinidumpException();
    598 
    599   const MDRawExceptionStream* exception() const {
    600     return valid_ ? &exception_ : NULL;
    601   }
    602 
    603   // The thread ID is used to determine if a thread is the exception thread,
    604   // so a special getter is provided to retrieve this data from the
    605   // MDRawExceptionStream structure.  Returns false if the thread ID cannot
    606   // be determined.
    607   bool GetThreadID(uint32_t *thread_id) const;
    608 
    609   MinidumpContext* GetContext();
    610 
    611   // Print a human-readable representation of the object to stdout.
    612   void Print();
    613 
    614  private:
    615   friend class Minidump;
    616 
    617   static const uint32_t kStreamType = MD_EXCEPTION_STREAM;
    618 
    619   explicit MinidumpException(Minidump* minidump);
    620 
    621   bool Read(uint32_t expected_size);
    622 
    623   MDRawExceptionStream exception_;
    624   MinidumpContext*     context_;
    625 };
    626 
    627 // MinidumpAssertion wraps MDRawAssertionInfo, which contains information
    628 // about an assertion that caused the minidump to be generated.
    629 class MinidumpAssertion : public MinidumpStream {
    630  public:
    631   virtual ~MinidumpAssertion();
    632 
    633   const MDRawAssertionInfo* assertion() const {
    634     return valid_ ? &assertion_ : NULL;
    635   }
    636 
    637   string expression() const {
    638     return valid_ ? expression_ : "";
    639   }
    640 
    641   string function() const {
    642     return valid_ ? function_ : "";
    643   }
    644 
    645   string file() const {
    646     return valid_ ? file_ : "";
    647   }
    648 
    649   // Print a human-readable representation of the object to stdout.
    650   void Print();
    651 
    652  private:
    653   friend class Minidump;
    654 
    655   static const uint32_t kStreamType = MD_ASSERTION_INFO_STREAM;
    656 
    657   explicit MinidumpAssertion(Minidump* minidump);
    658 
    659   bool Read(uint32_t expected_size);
    660 
    661   MDRawAssertionInfo assertion_;
    662   string expression_;
    663   string function_;
    664   string file_;
    665 };
    666 
    667 
    668 // MinidumpSystemInfo wraps MDRawSystemInfo and provides information about
    669 // the system on which the minidump was generated.  See also MinidumpMiscInfo.
    670 class MinidumpSystemInfo : public MinidumpStream {
    671  public:
    672   virtual ~MinidumpSystemInfo();
    673 
    674   const MDRawSystemInfo* system_info() const {
    675     return valid_ ? &system_info_ : NULL;
    676   }
    677 
    678   // GetOS and GetCPU return textual representations of the operating system
    679   // and CPU that produced the minidump.  Unlike most other Minidump* methods,
    680   // they return string objects, not weak pointers.  Defined values for
    681   // GetOS() are "mac", "windows", and "linux".  Defined values for GetCPU
    682   // are "x86" and "ppc".  These methods return an empty string when their
    683   // values are unknown.
    684   string GetOS();
    685   string GetCPU();
    686 
    687   // I don't know what CSD stands for, but this field is documented as
    688   // returning a textual representation of the OS service pack.  On other
    689   // platforms, this provides additional information about an OS version
    690   // level beyond major.minor.micro.  Returns NULL if unknown.
    691   const string* GetCSDVersion();
    692 
    693   // If a CPU vendor string can be determined, returns a pointer to it,
    694   // otherwise, returns NULL.  CPU vendor strings can be determined from
    695   // x86 CPUs with CPUID 0.
    696   const string* GetCPUVendor();
    697 
    698   // Print a human-readable representation of the object to stdout.
    699   void Print();
    700 
    701  protected:
    702   explicit MinidumpSystemInfo(Minidump* minidump);
    703   MDRawSystemInfo system_info_;
    704 
    705   // Textual representation of the OS service pack, for minidumps produced
    706   // by MiniDumpWriteDump on Windows.
    707   const string* csd_version_;
    708 
    709  private:
    710   friend class Minidump;
    711 
    712   static const uint32_t kStreamType = MD_SYSTEM_INFO_STREAM;
    713 
    714   bool Read(uint32_t expected_size);
    715 
    716   // A string identifying the CPU vendor, if known.
    717   const string* cpu_vendor_;
    718 };
    719 
    720 
    721 // MinidumpMiscInfo wraps MDRawMiscInfo and provides information about
    722 // the process that generated the minidump, and optionally additional system
    723 // information.  See also MinidumpSystemInfo.
    724 class MinidumpMiscInfo : public MinidumpStream {
    725  public:
    726   const MDRawMiscInfo* misc_info() const {
    727     return valid_ ? &misc_info_ : NULL;
    728   }
    729 
    730   // Print a human-readable representation of the object to stdout.
    731   void Print();
    732 
    733  private:
    734   friend class Minidump;
    735   friend class TestMinidumpMiscInfo;
    736 
    737   static const uint32_t kStreamType = MD_MISC_INFO_STREAM;
    738 
    739   explicit MinidumpMiscInfo(Minidump* minidump_);
    740 
    741   bool Read(uint32_t expected_size_);
    742 
    743   MDRawMiscInfo misc_info_;
    744 
    745   // Populated by Read.  Contains the converted strings from the corresponding
    746   // UTF-16 fields in misc_info_
    747   string standard_name_;
    748   string daylight_name_;
    749   string build_string_;
    750   string dbg_bld_str_;
    751 };
    752 
    753 
    754 // MinidumpBreakpadInfo wraps MDRawBreakpadInfo, which is an optional stream in
    755 // a minidump that provides additional information about the process state
    756 // at the time the minidump was generated.
    757 class MinidumpBreakpadInfo : public MinidumpStream {
    758  public:
    759   const MDRawBreakpadInfo* breakpad_info() const {
    760     return valid_ ? &breakpad_info_ : NULL;
    761   }
    762 
    763   // These thread IDs are used to determine if threads deserve special
    764   // treatment, so special getters are provided to retrieve this data from
    765   // the MDRawBreakpadInfo structure.  The getters return false if the thread
    766   // IDs cannot be determined.
    767   bool GetDumpThreadID(uint32_t *thread_id) const;
    768   bool GetRequestingThreadID(uint32_t *thread_id) const;
    769 
    770   // Print a human-readable representation of the object to stdout.
    771   void Print();
    772 
    773  private:
    774   friend class Minidump;
    775 
    776   static const uint32_t kStreamType = MD_BREAKPAD_INFO_STREAM;
    777 
    778   explicit MinidumpBreakpadInfo(Minidump* minidump_);
    779 
    780   bool Read(uint32_t expected_size_);
    781 
    782   MDRawBreakpadInfo breakpad_info_;
    783 };
    784 
    785 // MinidumpMemoryInfo wraps MDRawMemoryInfo, which provides information
    786 // about mapped memory regions in a process, including their ranges
    787 // and protection.
    788 class MinidumpMemoryInfo : public MinidumpObject {
    789  public:
    790   const MDRawMemoryInfo* info() const { return valid_ ? &memory_info_ : NULL; }
    791 
    792   // The address of the base of the memory region.
    793   uint64_t GetBase() const { return valid_ ? memory_info_.base_address : 0; }
    794 
    795   // The size, in bytes, of the memory region.
    796   uint64_t GetSize() const { return valid_ ? memory_info_.region_size : 0; }
    797 
    798   // Return true if the memory protection allows execution.
    799   bool IsExecutable() const;
    800 
    801   // Return true if the memory protection allows writing.
    802   bool IsWritable() const;
    803 
    804   // Print a human-readable representation of the object to stdout.
    805   void Print();
    806 
    807  private:
    808   // These objects are managed by MinidumpMemoryInfoList.
    809   friend class MinidumpMemoryInfoList;
    810 
    811   explicit MinidumpMemoryInfo(Minidump* minidump);
    812 
    813   // This works like MinidumpStream::Read, but is driven by
    814   // MinidumpMemoryInfoList.  No size checking is done, because
    815   // MinidumpMemoryInfoList handles that directly.
    816   bool Read();
    817 
    818   MDRawMemoryInfo memory_info_;
    819 };
    820 
    821 // MinidumpMemoryInfoList contains a list of information about
    822 // mapped memory regions for a process in the form of MDRawMemoryInfo.
    823 // It maintains a map of these structures so that it may easily provide
    824 // info corresponding to a specific address.
    825 class MinidumpMemoryInfoList : public MinidumpStream {
    826  public:
    827   virtual ~MinidumpMemoryInfoList();
    828 
    829   unsigned int info_count() const { return valid_ ? info_count_ : 0; }
    830 
    831   const MinidumpMemoryInfo* GetMemoryInfoForAddress(uint64_t address) const;
    832   const MinidumpMemoryInfo* GetMemoryInfoAtIndex(unsigned int index) const;
    833 
    834   // Print a human-readable representation of the object to stdout.
    835   void Print();
    836 
    837  private:
    838   friend class Minidump;
    839 
    840   typedef vector<MinidumpMemoryInfo> MinidumpMemoryInfos;
    841 
    842   static const uint32_t kStreamType = MD_MEMORY_INFO_LIST_STREAM;
    843 
    844   explicit MinidumpMemoryInfoList(Minidump* minidump);
    845 
    846   bool Read(uint32_t expected_size);
    847 
    848   // Access to memory info using addresses as the key.
    849   RangeMap<uint64_t, unsigned int> *range_map_;
    850 
    851   MinidumpMemoryInfos* infos_;
    852   uint32_t info_count_;
    853 };
    854 
    855 
    856 // Minidump is the user's interface to a minidump file.  It wraps MDRawHeader
    857 // and provides access to the minidump's top-level stream directory.
    858 class Minidump {
    859  public:
    860   // path is the pathname of a file containing the minidump.
    861   explicit Minidump(const string& path);
    862   // input is an istream wrapping minidump data. Minidump holds a
    863   // weak pointer to input, and the caller must ensure that the stream
    864   // is valid as long as the Minidump object is.
    865   explicit Minidump(std::istream& input);
    866 
    867   virtual ~Minidump();
    868 
    869   // path may be empty if the minidump was not opened from a file
    870   virtual string path() const {
    871     return path_;
    872   }
    873   static void set_max_streams(uint32_t max_streams) {
    874     max_streams_ = max_streams;
    875   }
    876   static uint32_t max_streams() { return max_streams_; }
    877 
    878   static void set_max_string_length(uint32_t max_string_length) {
    879     max_string_length_ = max_string_length;
    880   }
    881   static uint32_t max_string_length() { return max_string_length_; }
    882 
    883   virtual const MDRawHeader* header() const { return valid_ ? &header_ : NULL; }
    884 
    885   // Reads the CPU information from the system info stream and generates the
    886   // appropriate CPU flags.  The returned context_cpu_flags are the same as
    887   // if the CPU type bits were set in the context_flags of a context record.
    888   // On success, context_cpu_flags will have the flags that identify the CPU.
    889   // If a system info stream is missing, context_cpu_flags will be 0.
    890   // Returns true if the current position in the stream was not changed.
    891   // Returns false when the current location in the stream was changed and the
    892   // attempt to restore the original position failed.
    893   bool GetContextCPUFlagsFromSystemInfo(uint32_t* context_cpu_flags);
    894 
    895   // Reads the minidump file's header and top-level stream directory.
    896   // The minidump is expected to be positioned at the beginning of the
    897   // header.  Read() sets up the stream list and map, and validates the
    898   // Minidump object.
    899   virtual bool Read();
    900 
    901   // The next set of methods are stubs that call GetStream.  They exist to
    902   // force code generation of the templatized API within the module, and
    903   // to avoid exposing an ugly API (GetStream needs to accept a garbage
    904   // parameter).
    905   virtual MinidumpThreadList* GetThreadList();
    906   virtual MinidumpModuleList* GetModuleList();
    907   virtual MinidumpMemoryList* GetMemoryList();
    908   virtual MinidumpException* GetException();
    909   virtual MinidumpAssertion* GetAssertion();
    910   virtual MinidumpSystemInfo* GetSystemInfo();
    911   virtual MinidumpMiscInfo* GetMiscInfo();
    912   virtual MinidumpBreakpadInfo* GetBreakpadInfo();
    913   virtual MinidumpMemoryInfoList* GetMemoryInfoList();
    914 
    915   // The next set of methods are provided for users who wish to access
    916   // data in minidump files directly, while leveraging the rest of
    917   // this class and related classes to handle the basic minidump
    918   // structure and known stream types.
    919 
    920   unsigned int GetDirectoryEntryCount() const {
    921     return valid_ ? header_.stream_count : 0;
    922   }
    923   const MDRawDirectory* GetDirectoryEntryAtIndex(unsigned int index) const;
    924 
    925   // The next 2 methods are lower-level I/O routines.  They use fd_.
    926 
    927   // Reads count bytes from the minidump at the current position into
    928   // the storage area pointed to by bytes.  bytes must be of sufficient
    929   // size.  After the read, the file position is advanced by count.
    930   bool ReadBytes(void* bytes, size_t count);
    931 
    932   // Sets the position of the minidump file to offset.
    933   bool SeekSet(off_t offset);
    934 
    935   // Returns the current position of the minidump file.
    936   off_t Tell();
    937 
    938   // The next 2 methods are medium-level I/O routines.
    939 
    940   // ReadString returns a string which is owned by the caller!  offset
    941   // specifies the offset that a length-encoded string is stored at in the
    942   // minidump file.
    943   string* ReadString(off_t offset);
    944 
    945   // SeekToStreamType positions the file at the beginning of a stream
    946   // identified by stream_type, and informs the caller of the stream's
    947   // length by setting *stream_length.  Because stream_map maps each stream
    948   // type to only one stream in the file, this might mislead the user into
    949   // thinking that the stream that this seeks to is the only stream with
    950   // type stream_type.  That can't happen for streams that these classes
    951   // deal with directly, because they're only supposed to be present in the
    952   // file singly, and that's verified when stream_map_ is built.  Users who
    953   // are looking for other stream types should be aware of this
    954   // possibility, and consider using GetDirectoryEntryAtIndex (possibly
    955   // with GetDirectoryEntryCount) if expecting multiple streams of the same
    956   // type in a single minidump file.
    957   bool SeekToStreamType(uint32_t stream_type, uint32_t* stream_length);
    958 
    959   bool swap() const { return valid_ ? swap_ : false; }
    960 
    961   // Print a human-readable representation of the object to stdout.
    962   void Print();
    963 
    964  private:
    965   // MinidumpStreamInfo is used in the MinidumpStreamMap.  It lets
    966   // the Minidump object locate interesting streams quickly, and
    967   // provides a convenient place to stash MinidumpStream objects.
    968   struct MinidumpStreamInfo {
    969     MinidumpStreamInfo() : stream_index(0), stream(NULL) {}
    970     ~MinidumpStreamInfo() { delete stream; }
    971 
    972     // Index into the MinidumpDirectoryEntries vector
    973     unsigned int    stream_index;
    974 
    975     // Pointer to the stream if cached, or NULL if not yet populated
    976     MinidumpStream* stream;
    977   };
    978 
    979   typedef vector<MDRawDirectory> MinidumpDirectoryEntries;
    980   typedef map<uint32_t, MinidumpStreamInfo> MinidumpStreamMap;
    981 
    982   template<typename T> T* GetStream(T** stream);
    983 
    984   // Opens the minidump file, or if already open, seeks to the beginning.
    985   bool Open();
    986 
    987   // The largest number of top-level streams that will be read from a minidump.
    988   // Note that streams are only read (and only consume memory) as needed,
    989   // when directed by the caller.  The default is 128.
    990   static uint32_t max_streams_;
    991 
    992   // The maximum length of a UTF-16 string that will be read from a minidump
    993   // in 16-bit words.  The default is 1024.  UTF-16 strings are converted
    994   // to UTF-8 when stored in memory, and each UTF-16 word will be represented
    995   // by as many as 3 bytes in UTF-8.
    996   static unsigned int max_string_length_;
    997 
    998   MDRawHeader               header_;
    999 
   1000   // The list of streams.
   1001   MinidumpDirectoryEntries* directory_;
   1002 
   1003   // Access to streams using the stream type as the key.
   1004   MinidumpStreamMap*        stream_map_;
   1005 
   1006   // The pathname of the minidump file to process, set in the constructor.
   1007   // This may be empty if the minidump was opened directly from a stream.
   1008   const string              path_;
   1009 
   1010   // The stream for all file I/O.  Used by ReadBytes and SeekSet.
   1011   // Set based on the path in Open, or directly in the constructor.
   1012   std::istream*             stream_;
   1013 
   1014   // swap_ is true if the minidump file should be byte-swapped.  If the
   1015   // minidump was produced by a CPU that is other-endian than the CPU
   1016   // processing the minidump, this will be true.  If the two CPUs are
   1017   // same-endian, this will be false.
   1018   bool                      swap_;
   1019 
   1020   // Validity of the Minidump structure, false immediately after
   1021   // construction or after a failed Read(); true following a successful
   1022   // Read().
   1023   bool                      valid_;
   1024 };
   1025 
   1026 
   1027 }  // namespace google_breakpad
   1028 
   1029 
   1030 #endif  // GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__
   1031