aboutsummaryrefslogtreecommitdiff
path: root/src/google_airbag/processor/minidump.h
diff options
context:
space:
mode:
authormmentovai <mmentovai@4c0a9323-5329-0410-9bdc-e9ce6186880e>2006-12-05 22:52:28 +0000
committermmentovai <mmentovai@4c0a9323-5329-0410-9bdc-e9ce6186880e>2006-12-05 22:52:28 +0000
commitdb3342a10ec30902aa9018b80e1d9a40bd01c487 (patch)
tree933903715ae6d5d5f1b7827e0612314162b0aecf /src/google_airbag/processor/minidump.h
parentDon't use CRT in exception handler code (#86). r=bryner (diff)
downloadbreakpad-db3342a10ec30902aa9018b80e1d9a40bd01c487.tar.xz
Module API (#32). r=waylonis, bryner
- Introduces a standard API for dealing with modules. MinidumpModule is now a concrete implementation of this API. Code may interact with single modules using the CodeModule interface, and collections of modules using its container, the CodeModules interface. - CodeModule is used directly by SymbolSupplier implementations and SourceLineResolver. Reliance on the specific implementation in MinidumpModule has been eliminated. - Module lists are now added to ProcessState objects. Module references in each stack frame are now pointers to objects in these module lists. - The sample minidump_stackwalk tool prints the module list after printing all threads' stacks. http://groups.google.com/group/airbag-dev/browse_frm/thread/a9c0550edde54cf8 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@74 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/google_airbag/processor/minidump.h')
-rw-r--r--src/google_airbag/processor/minidump.h84
1 files changed, 50 insertions, 34 deletions
diff --git a/src/google_airbag/processor/minidump.h b/src/google_airbag/processor/minidump.h
index 2a666fe7..d9392655 100644
--- a/src/google_airbag/processor/minidump.h
+++ b/src/google_airbag/processor/minidump.h
@@ -85,6 +85,8 @@
#include <vector>
#include "google_airbag/common/minidump_format.h"
+#include "google_airbag/processor/code_module.h"
+#include "google_airbag/processor/code_modules.h"
#include "google_airbag/processor/memory_region.h"
@@ -162,7 +164,7 @@ class MinidumpStream : public MinidumpObject {
// user wants).
class MinidumpContext : public MinidumpStream {
public:
- ~MinidumpContext();
+ virtual ~MinidumpContext();
// Returns an MD_CONTEXT_* value such as MD_CONTEXT_X86 or MD_CONTEXT_PPC
// identifying the CPU type that the context was collected from. The
@@ -217,7 +219,7 @@ class MinidumpContext : public MinidumpStream {
class MinidumpMemoryRegion : public MinidumpObject,
public MemoryRegion {
public:
- ~MinidumpMemoryRegion();
+ virtual ~MinidumpMemoryRegion();
// Returns a pointer to the base of the memory region. Returns the
// cached value if available, otherwise, reads the minidump file and
@@ -272,7 +274,7 @@ class MinidumpMemoryRegion : public MinidumpObject,
// provided here.
class MinidumpThread : public MinidumpObject {
public:
- ~MinidumpThread();
+ virtual ~MinidumpThread();
const MDRawThread* thread() const { return valid_ ? &thread_ : NULL; }
MinidumpMemoryRegion* GetMemory();
@@ -308,7 +310,7 @@ class MinidumpThread : public MinidumpObject {
// a process.
class MinidumpThreadList : public MinidumpStream {
public:
- ~MinidumpThreadList();
+ virtual ~MinidumpThreadList();
unsigned int thread_count() const { return valid_ ? thread_count_ : 0; }
@@ -346,19 +348,24 @@ class MinidumpThreadList : public MinidumpStream {
// code modules. Access is provided to various data referenced indirectly
// by MDRawModule, such as the module's name and a specification for where
// to locate debugging information for the module.
-class MinidumpModule : public MinidumpObject {
+class MinidumpModule : public MinidumpObject,
+ public CodeModule {
public:
- ~MinidumpModule();
+ virtual ~MinidumpModule();
const MDRawModule* module() const { return valid_ ? &module_ : NULL; }
- u_int64_t base_address() const {
+
+ // CodeModule implementation
+ virtual u_int64_t base_address() const {
return valid_ ? module_.base_of_image : static_cast<u_int64_t>(-1);
}
- u_int32_t size() const { return valid_ ? module_.size_of_image : 0; }
-
- // The name of the file containing this module's code (exe, dll, so,
- // dylib).
- const string* GetName();
+ virtual u_int64_t size() const { return valid_ ? module_.size_of_image : 0; }
+ virtual string code_file() const;
+ virtual string code_identifier() const;
+ virtual string debug_file() const;
+ virtual string debug_identifier() const;
+ virtual string version() const;
+ virtual const CodeModule* Copy() const;
// The CodeView record, which contains information to locate the module's
// debugging information (pdb). This is returned as u_int8_t* because
@@ -372,12 +379,6 @@ class MinidumpModule : public MinidumpObject {
// field is not expected to be present.
const MDImageDebugMisc* GetMiscRecord();
- // The filename of the file containing debugging information for this
- // module. This data is supplied by the CodeView record, if present, or
- // the miscellaneous debug record. As such, it will reference either a
- // pdb or dbg file.
- const string* GetDebugFilename();
-
// Print a human-readable representation of the object to stdout.
void Print();
@@ -392,6 +393,21 @@ class MinidumpModule : public MinidumpObject {
// MinidumpModuleList handles that directly.
bool Read();
+ // Reads indirectly-referenced data, including the module name, CodeView
+ // record, and miscellaneous debugging record. This is necessary to allow
+ // MinidumpModuleList to fully construct MinidumpModule objects without
+ // requiring seeks to read a contiguous set of MinidumpModule objects.
+ // All auxiliary data should be available when Read is called, in order to
+ // allow the CodeModule getters to be const methods.
+ bool ReadAuxiliaryData();
+
+ // True after a successful Read. This is different from valid_, which is
+ // not set true until ReadAuxiliaryData also completes successfully.
+ // module_valid_ is only used by ReadAuxiliaryData and the functions it
+ // calls to determine whether the object is ready for auxiliary data to
+ // be read.
+ bool module_valid_;
+
MDRawModule module_;
// Cached module name.
@@ -407,9 +423,6 @@ class MinidumpModule : public MinidumpObject {
// because the structure contains a variable-sized string and its exact
// size cannot be known until it is processed.
vector<u_int8_t>* misc_record_;
-
- // Cached debug filename.
- const string* debug_filename_;
};
@@ -417,18 +430,21 @@ class MinidumpModule : public MinidumpObject {
// in the form of MinidumpModules. It maintains a map of these modules
// so that it may easily provide a code module corresponding to a specific
// address.
-class MinidumpModuleList : public MinidumpStream {
+class MinidumpModuleList : public MinidumpStream,
+ public CodeModules {
public:
- ~MinidumpModuleList();
-
- unsigned int module_count() const { return valid_ ? module_count_ : 0; }
+ virtual ~MinidumpModuleList();
- // Sequential access to modules.
- MinidumpModule* GetModuleAtIndex(unsigned int index) const;
-
- // Random access to modules. Returns the module whose code is present
- // at the address identified by address.
- MinidumpModule* GetModuleForAddress(u_int64_t address);
+ // CodeModules implementation.
+ virtual unsigned int module_count() const {
+ return valid_ ? module_count_ : 0;
+ }
+ virtual const MinidumpModule* GetModuleForAddress(u_int64_t address) const;
+ virtual const MinidumpModule* GetMainModule() const;
+ virtual const MinidumpModule* GetModuleAtSequence(
+ unsigned int sequence) const;
+ virtual const MinidumpModule* GetModuleAtIndex(unsigned int index) const;
+ virtual const CodeModules* Copy() const;
// Print a human-readable representation of the object to stdout.
void Print();
@@ -463,7 +479,7 @@ class MinidumpModuleList : public MinidumpStream {
// memory minidumps contain all of a process' mapped memory.
class MinidumpMemoryList : public MinidumpStream {
public:
- ~MinidumpMemoryList();
+ virtual ~MinidumpMemoryList();
unsigned int region_count() const { return valid_ ? region_count_ : 0; }
@@ -512,7 +528,7 @@ class MinidumpMemoryList : public MinidumpStream {
// the exception occurred.
class MinidumpException : public MinidumpStream {
public:
- ~MinidumpException();
+ virtual ~MinidumpException();
const MDRawExceptionStream* exception() const {
return valid_ ? &exception_ : NULL;
@@ -547,7 +563,7 @@ class MinidumpException : public MinidumpStream {
// the system on which the minidump was generated. See also MinidumpMiscInfo.
class MinidumpSystemInfo : public MinidumpStream {
public:
- ~MinidumpSystemInfo();
+ virtual ~MinidumpSystemInfo();
const MDRawSystemInfo* system_info() const {
return valid_ ? &system_info_ : NULL;