diff options
Diffstat (limited to 'src/google_breakpad')
3 files changed, 129 insertions, 1 deletions
diff --git a/src/google_breakpad/processor/basic_source_line_resolver.h b/src/google_breakpad/processor/basic_source_line_resolver.h index 4019049d..6cf99705 100644 --- a/src/google_breakpad/processor/basic_source_line_resolver.h +++ b/src/google_breakpad/processor/basic_source_line_resolver.h @@ -64,6 +64,8 @@ class BasicSourceLineResolver : public SourceLineResolverBase { private: // friend declarations: friend class BasicModuleFactory; + friend class ModuleComparer; + friend class ModuleSerializer; template<class> friend class SimpleSerializer; // Function derives from SourceLineResolverBase::Function. @@ -71,7 +73,9 @@ class BasicSourceLineResolver : public SourceLineResolverBase { // Module implements SourceLineResolverBase::Module interface. class Module; - // Helper method. + // Helper methods to manage C-String format symbol data. + // See "google_breakpad/processor/source_line_resolver_base.h" for more + // comments about these helper methods. virtual void DeleteDataAfterLoad(char *symbol_data); // No-op helper methods. virtual void DeleteDataUnload(const CodeModule *module) { } diff --git a/src/google_breakpad/processor/fast_source_line_resolver.h b/src/google_breakpad/processor/fast_source_line_resolver.h new file mode 100644 index 00000000..4bb74f1a --- /dev/null +++ b/src/google_breakpad/processor/fast_source_line_resolver.h @@ -0,0 +1,107 @@ +// Copyright (c) 2010 Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// fast_source_line_resolver.h: FastSourceLineResolver is derived from +// SourceLineResolverBase, and is a concrete implementation of +// SourceLineResolverInterface. +// +// FastSourceLineResolver is a sibling class of BasicSourceLineResolver. The +// difference is FastSourceLineResolver loads a serialized memory chunk of data +// which can be used directly a Module without parsing or copying of underlying +// data. Therefore loading a symbol in FastSourceLineResolver is much faster +// and more memory-efficient than BasicSourceLineResolver. +// +// See "source_line_resolver_base.h" and +// "google_breakpad/source_line_resolver_interface.h" for more reference. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_FAST_SOURCE_LINE_RESOLVER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_FAST_SOURCE_LINE_RESOLVER_H__ + +#include <map> +#include <string> + +#include "google_breakpad/processor/source_line_resolver_base.h" + +namespace google_breakpad { + +using std::map; + +class FastSourceLineResolver : public SourceLineResolverBase { + public: + FastSourceLineResolver(); + virtual ~FastSourceLineResolver() { } + + using SourceLineResolverBase::FillSourceLineInfo; + using SourceLineResolverBase::FindCFIFrameInfo; + using SourceLineResolverBase::FindWindowsFrameInfo; + using SourceLineResolverBase::HasModule; + using SourceLineResolverBase::LoadModule; + using SourceLineResolverBase::LoadModuleUsingMapBuffer; + using SourceLineResolverBase::LoadModuleUsingMemoryBuffer; + using SourceLineResolverBase::UnloadModule; + + private: + // Friend declarations. + friend class ModuleComparer; + friend class ModuleSerializer; + friend class FastModuleFactory; + + // Nested types that will derive from corresponding nested types defined in + // SourceLineResolverBase. + struct Line; + struct Function; + struct PublicSymbol; + class Module; + + // Deserialize raw memory data to construct a WindowsFrameInfo object. + static WindowsFrameInfo CopyWFI(const char *raw_memory); + + // Helper methods to manage C-String format symbol data. + // See "google_breakpad/processor/source_line_resolver_base.h" for more + // comments about these helper methods. + virtual void StoreDataBeforeLoad(const CodeModule *module, char *symbol_data); + virtual void DeleteDataUnload(const CodeModule *module); + virtual void ClearLocalMemory(); + // No-op helper method. + virtual void DeleteDataAfterLoad(char *symbol_data) { } + + // Store memory data allocated in LoadModule and LoadModuleUsingMapBuffer. + typedef std::map<string, char*, CompareString> MemoryMap; + MemoryMap memory_chunks_; + + // Disallow unwanted copy ctor and assignment operator + FastSourceLineResolver(const FastSourceLineResolver&); + void operator=(const FastSourceLineResolver&); +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_FAST_SOURCE_LINE_RESOLVER_H__ diff --git a/src/google_breakpad/processor/source_line_resolver_base.h b/src/google_breakpad/processor/source_line_resolver_base.h index 3d978877..8113e2ed 100644 --- a/src/google_breakpad/processor/source_line_resolver_base.h +++ b/src/google_breakpad/processor/source_line_resolver_base.h @@ -80,9 +80,26 @@ class SourceLineResolverBase : public SourceLineResolverInterface { virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame); // Helper methods to manage C-String format symbol data. + // These methods are defined as no-op by default. + // + // StoreDataBeforeLoad() will be called in LoadModule() and + // LoadModuleUsingMapBuffer() to let subclass decide whether or how to store + // the dynamicly allocated memory data, before passing the data to + // LoadModuleUsingMemoryBuffer() which actually loads the module. virtual void StoreDataBeforeLoad(const CodeModule *module, char *symbol_data); + + // DeleteDataAfterLoad() will be called at the end of + // LoadModuleUsingMemoryBuffer() to let subclass decide whether to delete the + // allocated memory data or not (which depends on whether the subclass has + // ownership of the data or not). virtual void DeleteDataAfterLoad(char *symbol_data); + + // DeleteDataUnload() will be called in UnloadModule() to let subclass clean + // up dynamicly allocated data associated with the module, if there is any. virtual void DeleteDataUnload(const CodeModule *module); + + // ClearLocalMemory() will be called in destructor to let subclass clean up + // all local memory data it owns, if there is any. virtual void ClearLocalMemory(); // Nested structs and classes. |