From 97d392dc4b60f0099cd7ad8c8a5f06581a532392 Mon Sep 17 00:00:00 2001 From: mmentovai Date: Wed, 10 Jan 2007 22:47:56 +0000 Subject: Communicate OS and CPU to SymbolSupplier (#107). r=bryner Interface change: moved a few fields around in ProcessState; added new arguments to Stackwalker and SymbolSupplier. http://groups.google.com/group/airbag-dev/browse_thread/thread/17e4a48ec3ede932 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@101 4c0a9323-5329-0410-9bdc-e9ce6186880e --- src/google_airbag/processor/minidump.h | 9 +++ src/google_airbag/processor/minidump_processor.h | 21 +++--- src/google_airbag/processor/process_state.h | 32 ++------- src/google_airbag/processor/stackwalker.h | 12 +++- src/google_airbag/processor/symbol_supplier.h | 7 +- src/google_airbag/processor/system_info.h | 89 ++++++++++++++++++++++++ 6 files changed, 128 insertions(+), 42 deletions(-) create mode 100644 src/google_airbag/processor/system_info.h (limited to 'src/google_airbag') diff --git a/src/google_airbag/processor/minidump.h b/src/google_airbag/processor/minidump.h index d9392655..f2700119 100644 --- a/src/google_airbag/processor/minidump.h +++ b/src/google_airbag/processor/minidump.h @@ -569,6 +569,15 @@ class MinidumpSystemInfo : public MinidumpStream { return valid_ ? &system_info_ : NULL; } + // GetOS and GetCPU return textual representations of the operating system + // and CPU that produced the minidump. Unlike most other Minidump* methods, + // they return string objects, not weak pointers. Defined values for + // GetOS() are "mac", "windows", and "linux". Defined values for GetCPU + // are "x86" and "ppc". These methods return an empty string when their + // values are unknown. + string GetOS(); + string GetCPU(); + // I don't know what CSD stands for, but this field is documented as // returning a textual representation of the OS service pack. On other // platforms, this provides additional information about an OS version diff --git a/src/google_airbag/processor/minidump_processor.h b/src/google_airbag/processor/minidump_processor.h index a50d8a79..b1ee5392 100644 --- a/src/google_airbag/processor/minidump_processor.h +++ b/src/google_airbag/processor/minidump_processor.h @@ -40,6 +40,7 @@ class Minidump; class ProcessState; class SourceLineResolverInterface; class SymbolSupplier; +class SystemInfo; class MinidumpProcessor { public: @@ -60,19 +61,15 @@ class MinidumpProcessor { ProcessResult Process(const string &minidump_file, ProcessState *process_state); - // Returns a textual representation of the base CPU type that the minidump - // in dump was produced on. Returns an empty string if this information - // cannot be determined. If cpu_info is non-NULL, it will be set to - // contain additional identifying information about the CPU, or it will - // be set empty if additional information cannot be determined. - static string GetCPUInfo(Minidump *dump, string *cpu_info); + // Populates the cpu_* fields of the |info| parameter with textual + // representations of the CPU type that the minidump in |dump| was + // produced on. + static void GetCPUInfo(Minidump *dump, SystemInfo *info); - // Returns a textual representation of the operating system that the - // minidump in dump was produced on. Returns an empty string if this - // information cannot be determined. If os_version is non-NULL, it - // will be set to contain information about the specific version of the - // OS, or it will be set empty if version information cannot be determined. - static string GetOSInfo(Minidump *dump, string *os_version); + // Populates the os_* fields of the |info| parameter with textual + // representations of the operating system that the minidump in |dump| + // was produced on. + static void GetOSInfo(Minidump *dump, SystemInfo *info); // Returns a textual representation of the reason that a crash occurred, // if the minidump in dump was produced as a result of a crash. Returns diff --git a/src/google_airbag/processor/process_state.h b/src/google_airbag/processor/process_state.h index 6fe12155..5ef8047f 100644 --- a/src/google_airbag/processor/process_state.h +++ b/src/google_airbag/processor/process_state.h @@ -36,6 +36,7 @@ #include #include +#include "google_airbag/processor/system_info.h" namespace google_airbag { @@ -60,10 +61,7 @@ class ProcessState { u_int64_t crash_address() const { return crash_address_; } int requesting_thread() const { return requesting_thread_; } const vector* threads() const { return &threads_; } - string os() const { return os_; } - string os_version() const { return os_version_; } - string cpu() const { return cpu_; } - string cpu_info() const { return cpu_info_; } + const SystemInfo* system_info() const { return &system_info_; } const CodeModules* modules() const { return modules_; } private: @@ -103,28 +101,8 @@ class ProcessState { // thread) at the time of the crash. vector threads_; - // A string identifying the operating system, such as "Windows NT", - // "Mac OS X", or "Linux". If the information is present in the dump but - // its value is unknown, this field will contain a numeric value. If - // the information is not present in the dump, this field will be empty. - string os_; - - // A string identifying the version of the operating system, such as - // "5.1.2600 Service Pack 2" or "10.4.8 8L2127". If the dump does not - // contain this information, this field will be empty. - string os_version_; - - // A string identifying the basic CPU family, such as "x86" or "ppc". - // If this information is present in the dump but its value is unknown, - // this field will contain a numeric value. If the information is not - // present in the dump, this field will be empty. - string cpu_; - - // A string further identifying the specific CPU, such as - // "GenuineIntel level 6 model 13 stepping 8". If the information is not - // present in the dump, or additional identifying information is not - // defined for the CPU family, this field will be empty. - string cpu_info_; + // OS and CPU information. + SystemInfo system_info_; // The modules that were loaded into the process represented by the // ProcessState. @@ -133,4 +111,4 @@ class ProcessState { } // namespace google_airbag -#endif // GOOGLE_AIRBAG_PROCESSOR_CALL_STACK_H__ +#endif // GOOGLE_AIRBAG_PROCESSOR_PROCESS_STATE_H__ diff --git a/src/google_airbag/processor/stackwalker.h b/src/google_airbag/processor/stackwalker.h index 381b9e29..c058f09a 100644 --- a/src/google_airbag/processor/stackwalker.h +++ b/src/google_airbag/processor/stackwalker.h @@ -54,6 +54,7 @@ class SourceLineResolverInterface; struct StackFrame; struct StackFrameInfo; class SymbolSupplier; +class SystemInfo; using std::vector; @@ -71,13 +72,15 @@ class Stackwalker { // Returns a new concrete subclass suitable for the CPU that a stack was // generated on, according to the CPU type indicated by the context // argument. If no suitable concrete subclass exists, returns NULL. - static Stackwalker* StackwalkerForCPU(MinidumpContext *context, + static Stackwalker* StackwalkerForCPU(const SystemInfo *system_info, + MinidumpContext *context, MemoryRegion *memory, const CodeModules *modules, SymbolSupplier *supplier, SourceLineResolverInterface *resolver); protected: + // system_info identifies the operating system, NULL or empty if unknown. // memory identifies a MemoryRegion that provides the stack memory // for the stack to walk. modules, if non-NULL, is a CodeModules // object that is used to look up which code module each stack frame is @@ -86,11 +89,16 @@ class Stackwalker { // resolved. resolver is an instance of SourceLineResolverInterface // (see source_line_resolver_interface.h and basic_source_line_resolver.h). // If resolver is NULL, source line info will not be resolved. - Stackwalker(MemoryRegion *memory, + Stackwalker(const SystemInfo *system_info, + MemoryRegion *memory, const CodeModules *modules, SymbolSupplier *supplier, SourceLineResolverInterface *resolver); + // Information about the system that produced the minidump. Subclasses + // and the SymbolSupplier may find this information useful. + const SystemInfo *system_info_; + // The stack memory to walk. Subclasses will require this region to // get information from the stack. MemoryRegion *memory_; diff --git a/src/google_airbag/processor/symbol_supplier.h b/src/google_airbag/processor/symbol_supplier.h index d456174b..b5ced8ca 100644 --- a/src/google_airbag/processor/symbol_supplier.h +++ b/src/google_airbag/processor/symbol_supplier.h @@ -39,6 +39,7 @@ namespace google_airbag { using std::string; class CodeModule; +class SystemInfo; class SymbolSupplier { public: @@ -57,8 +58,12 @@ class SymbolSupplier { virtual ~SymbolSupplier() {} // Retrieves the symbol file for the given CodeModule, placing the - // path in symbol_file if successful. + // path in symbol_file if successful. system_info contains strings + // identifying the operating system and CPU; SymbolSupplier may use to help + // locate the symbol file. system_info may be NULL or its fields may be + // empty if these values are unknown. virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, string *symbol_file) = 0; }; diff --git a/src/google_airbag/processor/system_info.h b/src/google_airbag/processor/system_info.h new file mode 100644 index 00000000..faa4502c --- /dev/null +++ b/src/google_airbag/processor/system_info.h @@ -0,0 +1,89 @@ +// Copyright (c) 2006, 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. + +// system_info.h: Information about the system that was running a program +// when a crash report was produced. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_AIRBAG_PROCESSOR_SYSTEM_INFO_H__ +#define GOOGLE_AIRBAG_PROCESSOR_SYSTEM_INFO_H__ + +#include + +namespace google_airbag { + +using std::string; + +struct SystemInfo { + public: + // Resets the SystemInfo object to its default values. + void Clear() { + os.clear(); + os_short.clear(); + os_version.clear(); + cpu.clear(); + cpu_info.clear(); + } + + // A string identifying the operating system, such as "Windows NT", + // "Mac OS X", or "Linux". If the information is present in the dump but + // its value is unknown, this field will contain a numeric value. If + // the information is not present in the dump, this field will be empty. + string os; + + // A short form of the os string, using lowercase letters and no spaces, + // suitable for use in a filesystem. Possible values are "windows", + // "mac", and "linux". Empty if the information is not present in the dump + // or if the OS given by the dump is unknown. The values stored in this + // field should match those used by MinidumpSystemInfo::GetOS. + string os_short; + + // A string identifying the version of the operating system, such as + // "5.1.2600 Service Pack 2" or "10.4.8 8L2127". If the dump does not + // contain this information, this field will be empty. + string os_version; + + // A string identifying the basic CPU family, such as "x86" or "ppc". + // If this information is present in the dump but its value is unknown, + // this field will contain a numeric value. If the information is not + // present in the dump, this field will be empty. The values stored in + // this field should match those used by MinidumpSystemInfo::GetCPU. + string cpu; + + // A string further identifying the specific CPU, such as + // "GenuineIntel level 6 model 13 stepping 8". If the information is not + // present in the dump, or additional identifying information is not + // defined for the CPU family, this field will be empty. + string cpu_info; +}; + +} // namespace google_airbag + +#endif // GOOGLE_AIRBAG_PROCESSOR_SYSTEM_INFO_H__ -- cgit v1.2.1