From 2ad976ef0ba44f36842b9b7a11848f6b40fd25d5 Mon Sep 17 00:00:00 2001 From: nealsid Date: Fri, 27 Feb 2009 23:59:40 +0000 Subject: [PATCH] Fix for issues 296, 297. Various symbol supplier classes need to be updated with new overload('make check' was failing, as well as crash_report), and remove logging that was flooding output git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@318 4c0a9323-5329-0410-9bdc-e9ce6186880e --- .../processor/symbol_supplier.h | 4 ++-- src/processor/contained_range_map-inl.h | 13 ++++++---- src/processor/minidump_processor_unittest.cc | 24 +++++++++++++++++++ src/processor/simple_symbol_supplier.cc | 21 ++++++++++++++++ src/processor/simple_symbol_supplier.h | 6 ++--- .../crash_report/on_demand_symbol_supplier.h | 9 +++++-- .../crash_report/on_demand_symbol_supplier.mm | 22 +++++++++++++++++ 7 files changed, 88 insertions(+), 11 deletions(-) diff --git a/src/google_breakpad/processor/symbol_supplier.h b/src/google_breakpad/processor/symbol_supplier.h index 752bbbc3..7b9d00e4 100644 --- a/src/google_breakpad/processor/symbol_supplier.h +++ b/src/google_breakpad/processor/symbol_supplier.h @@ -67,14 +67,14 @@ class SymbolSupplier { const SystemInfo *system_info, string *symbol_file) = 0; // Same as above, except also places symbol data into symbol_data. - // If symbol_data is NULL, the data is not returned. + // If symbol_data is NULL, the data is not returned. // TODO(nealsid) Once we have symbol data caching behavior implemented // investigate making all symbol suppliers implement all methods, // and make this pure virtual virtual SymbolResult GetSymbolFile(const CodeModule *module, const SystemInfo *system_info, string *symbol_file, - string *symbol_data) { assert(0); } + string *symbol_data) = 0; }; } // namespace google_breakpad diff --git a/src/processor/contained_range_map-inl.h b/src/processor/contained_range_map-inl.h index cf5ff235..5cc498df 100644 --- a/src/processor/contained_range_map-inl.h +++ b/src/processor/contained_range_map-inl.h @@ -60,8 +60,12 @@ bool ContainedRangeMap::StoreRange( // Check for undersize or overflow. if (size <= 0 || high < base) { - BPLOG(INFO) << "StoreRange failed, " << HexString(base) << "+" << - HexString(size) << ", " << HexString(high); + //TODO(nealsid) We are commenting this out in order to prevent + // excessive logging. We plan to move to better logging as this + // failure happens quite often and is expected(see comment in + // basic_source_line_resolver.cc:671). + // BPLOG(INFO) << "StoreRange failed, " << HexString(base) << "+" + // << HexString(size) << ", " << HexString(high); return false; } @@ -81,8 +85,9 @@ bool ContainedRangeMap::StoreRange( // it must fail. iterator_base->first contains the key, which was the // containing child's high address. if (iterator_base->second->base_ == base && iterator_base->first == high) { - BPLOG(INFO) << "StoreRange failed, identical range is already " - "present: " << HexString(base) << "+" << HexString(size); + // TODO(nealsid): See the TODO above on why this is commented out. +// BPLOG(INFO) << "StoreRange failed, identical range is already " +// "present: " << HexString(base) << "+" << HexString(size); return false; } diff --git a/src/processor/minidump_processor_unittest.cc b/src/processor/minidump_processor_unittest.cc index 06fa5408..bf8a8989 100644 --- a/src/processor/minidump_processor_unittest.cc +++ b/src/processor/minidump_processor_unittest.cc @@ -32,6 +32,8 @@ #include #include +#include +#include #include "google_breakpad/processor/basic_source_line_resolver.h" #include "google_breakpad/processor/call_stack.h" #include "google_breakpad/processor/code_module.h" @@ -89,6 +91,11 @@ class TestSymbolSupplier : public SymbolSupplier { const SystemInfo *system_info, string *symbol_file); + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data); + // When set to true, causes the SymbolSupplier to return INTERRUPT void set_interrupt(bool interrupt) { interrupt_ = interrupt; } @@ -123,6 +130,23 @@ SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile( return NOT_FOUND; } +SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile( + const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data) { + SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info, + symbol_file); + if (s == FOUND) { + std::ifstream in(symbol_file->c_str()); + std::getline(in, *symbol_data, std::string::traits_type::to_char_type( + std::string::traits_type::eof())); + in.close(); + } + + return s; +} + static bool RunTests() { TestSymbolSupplier supplier; BasicSourceLineResolver resolver; diff --git a/src/processor/simple_symbol_supplier.cc b/src/processor/simple_symbol_supplier.cc index 9c1aac4e..c593e955 100644 --- a/src/processor/simple_symbol_supplier.cc +++ b/src/processor/simple_symbol_supplier.cc @@ -38,6 +38,8 @@ #include #include +#include +#include #include "processor/simple_symbol_supplier.h" #include "google_breakpad/processor/code_module.h" @@ -71,6 +73,25 @@ SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFile( return NOT_FOUND; } +SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFile( + const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data) { + assert(symbol_data); + symbol_data->clear(); + + SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info, symbol_file); + + if (s == FOUND) { + std::ifstream in(symbol_file->c_str()); + std::getline(in, *symbol_data, std::string::traits_type::to_char_type( + std::string::traits_type::eof())); + in.close(); + } + return s; +} + SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFileAtPathFromRoot( const CodeModule *module, const SystemInfo *system_info, const string &root_path, string *symbol_file) { diff --git a/src/processor/simple_symbol_supplier.h b/src/processor/simple_symbol_supplier.h index 9343e448..dff6a512 100644 --- a/src/processor/simple_symbol_supplier.h +++ b/src/processor/simple_symbol_supplier.h @@ -107,9 +107,9 @@ class SimpleSymbolSupplier : public SymbolSupplier { string *symbol_file); virtual SymbolResult GetSymbolFile(const CodeModule *module, - const SystemInfo *system_info, - string *symbol_file, - string *symbol_data) { assert(0); } + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data); protected: SymbolResult GetSymbolFileAtPathFromRoot(const CodeModule *module, const SystemInfo *system_info, diff --git a/src/tools/mac/crash_report/on_demand_symbol_supplier.h b/src/tools/mac/crash_report/on_demand_symbol_supplier.h index 0c3ebff9..9c0e8b78 100644 --- a/src/tools/mac/crash_report/on_demand_symbol_supplier.h +++ b/src/tools/mac/crash_report/on_demand_symbol_supplier.h @@ -47,7 +47,7 @@ class OnDemandSymbolSupplier : public SymbolSupplier { public: // |search_dir| is the directory to search for alternative symbols with // the same name as the module in the minidump - OnDemandSymbolSupplier(const string &search_dir, + OnDemandSymbolSupplier(const string &search_dir, const string &symbol_search_dir); virtual ~OnDemandSymbolSupplier() {} @@ -56,11 +56,16 @@ class OnDemandSymbolSupplier : public SymbolSupplier { const SystemInfo *system_info, string *symbol_file); + // Returns the path to the symbol file for the given module. + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data); protected: // Search directory string search_dir_; string symbol_search_dir_; - + // When we create a symbol file for a module, save the name of the module // and the path to that module's symbol file. map module_file_map_; diff --git a/src/tools/mac/crash_report/on_demand_symbol_supplier.mm b/src/tools/mac/crash_report/on_demand_symbol_supplier.mm index b8501955..4123a27c 100644 --- a/src/tools/mac/crash_report/on_demand_symbol_supplier.mm +++ b/src/tools/mac/crash_report/on_demand_symbol_supplier.mm @@ -30,6 +30,8 @@ #include #include #include +#include +#include #include "google_breakpad/processor/basic_source_line_resolver.h" #include "google_breakpad/processor/minidump.h" @@ -136,6 +138,26 @@ OnDemandSymbolSupplier::GetSymbolFile(const CodeModule *module, return FOUND; } +SymbolSupplier::SymbolResult +OnDemandSymbolSupplier::GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data) { + SymbolSupplier::SymbolResult s = GetSymbolFile(module, + system_info, + symbol_file); + + + if (s == FOUND) { + ifstream in(symbol_file->c_str()); + getline(in, *symbol_data, std::string::traits_type::to_char_type( + std::string::traits_type::eof())); + in.close(); + } + + return s; +} + string OnDemandSymbolSupplier::GetLocalModulePath(const CodeModule *module) { NSFileManager *mgr = [NSFileManager defaultManager]; const char *moduleStr = module->code_file().c_str();