diff options
author | SiyangXie@gmail.com <SiyangXie@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2010-11-01 17:31:31 +0000 |
---|---|---|
committer | SiyangXie@gmail.com <SiyangXie@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2010-11-01 17:31:31 +0000 |
commit | a8c1c466a16ad4c85bfd1ca20ab8fc056d669abe (patch) | |
tree | a2125b96e08b34b828364885d9cd52845a1eff93 /src/tools/mac | |
parent | Add missing module_serializer.h and module_serializer.cc for class ModuleSeri... (diff) | |
download | breakpad-a8c1c466a16ad4c85bfd1ca20ab8fc056d669abe.tar.xz |
Restrict ownership of symbol data buffers to symbol supplier.
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@721 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/tools/mac')
-rw-r--r-- | src/tools/mac/crash_report/on_demand_symbol_supplier.h | 9 | ||||
-rw-r--r-- | src/tools/mac/crash_report/on_demand_symbol_supplier.mm | 26 |
2 files changed, 31 insertions, 4 deletions
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 2bad776d..28002c6b 100644 --- a/src/tools/mac/crash_report/on_demand_symbol_supplier.h +++ b/src/tools/mac/crash_report/on_demand_symbol_supplier.h @@ -61,10 +61,16 @@ class OnDemandSymbolSupplier : public SymbolSupplier { const SystemInfo *system_info, string *symbol_file, string *symbol_data); + // Allocates data buffer on heap, and takes the ownership of + // the data buffer. virtual SymbolResult GetCStringSymbolData(const CodeModule *module, const SystemInfo *system_info, string *symbol_file, char **symbol_data); + + // Delete the data buffer allocated for module in GetCStringSymbolData(). + virtual void FreeSymbolData(const CodeModule *module); + protected: // Search directory string search_dir_; @@ -74,6 +80,9 @@ class OnDemandSymbolSupplier : public SymbolSupplier { // and the path to that module's symbol file. map<string, string> module_file_map_; + // Map of allocated data buffers, keyed by module->code_file(). + map<string, char *> memory_buffers_; + // Return the name for |module| This will be the value used as the key // to the |module_file_map_|. string GetNameForModule(const CodeModule *module); 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 e1db9203..f71aebd9 100644 --- a/src/tools/mac/crash_report/on_demand_symbol_supplier.mm +++ b/src/tools/mac/crash_report/on_demand_symbol_supplier.mm @@ -32,6 +32,7 @@ #include <string> #include <iostream> #include <fstream> +#include <utility> #include "google_breakpad/processor/basic_source_line_resolver.h" #include "google_breakpad/processor/minidump.h" @@ -49,7 +50,7 @@ using google_breakpad::PathnameStripper; using google_breakpad::SymbolSupplier; using google_breakpad::SystemInfo; -OnDemandSymbolSupplier::OnDemandSymbolSupplier(const string &search_dir, +OnDemandSymbolSupplier::OnDemandSymbolSupplier(const string &search_dir, const string &symbol_search_dir) : search_dir_(search_dir) { NSFileManager *mgr = [NSFileManager defaultManager]; @@ -169,10 +170,27 @@ OnDemandSymbolSupplier::GetCStringSymbolData(const CodeModule *module, system_info, symbol_file, &symbol_data_string); - strcpy(*symbol_data, symbol_data_string.c_str()); + if (result == FOUND) { + unsigned int size = symbol_data_string.size() + 1; + *symbol_data = new char[size]; + if (*symbol_data == NULL) { + // Should return INTERRUPT on memory allocation failure. + return INTERRUPT; + } + strcpy(*symbol_data, symbol_data_string.c_str()); + memory_buffers_.insert(make_pair(module->code_file(), *symbol_data); + } return result; } +void OnDemandSymbolSupplier::FreeSymbolData(const CodeModule *module) { + map<string, char *>::iterator it = memory_buffers_.find(module->code_file()); + if (it != memory_buffers_.end()) { + delete [] it->second; + memory_buffers_.erase(it); + } +} + string OnDemandSymbolSupplier::GetLocalModulePath(const CodeModule *module) { NSFileManager *mgr = [NSFileManager defaultManager]; const char *moduleStr = module->code_file().c_str(); @@ -281,9 +299,9 @@ bool OnDemandSymbolSupplier::GenerateSymbolFile(const CodeModule *module, } else { printf("Unable to open %s (%d)\n", name.c_str(), errno); result = false; - } + } } else { - printf("Architecture %s not available for %s\n", + printf("Architecture %s not available for %s\n", system_info->cpu.c_str(), name.c_str()); result = false; } |