Reduce calls to SymbolSupplier::GetSymbolFile() (#48).

git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@40 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
bryner 2006-10-16 18:19:09 +00:00
parent 8b1645d8cd
commit 181f307ffe
4 changed files with 16 additions and 5 deletions

View File

@ -165,6 +165,10 @@ bool SourceLineResolver::LoadModule(const string &module_name,
return true; return true;
} }
bool SourceLineResolver::HasModule(const string &module_name) const {
return modules_->find(module_name) != modules_->end();
}
void SourceLineResolver::FillSourceLineInfo(StackFrame *frame, void SourceLineResolver::FillSourceLineInfo(StackFrame *frame,
StackFrameInfo *frame_info) const { StackFrameInfo *frame_info) const {
ModuleMap::const_iterator it = modules_->find(frame->module_name); ModuleMap::const_iterator it = modules_->find(frame->module_name);

View File

@ -60,6 +60,9 @@ class SourceLineResolver {
// map_file should contain line/address mappings for this module. // map_file should contain line/address mappings for this module.
bool LoadModule(const string &module_name, const string &map_file); bool LoadModule(const string &module_name, const string &map_file);
// Returns true if a module with the given name has been loaded.
bool HasModule(const string &module_name) const;
// Fills in the function_base, function_name, source_file_name, // Fills in the function_base, function_name, source_file_name,
// and source_line fields of the StackFrame. The instruction and // and source_line fields of the StackFrame. The instruction and
// module_name fields must already be filled in. Additional debugging // module_name fields must already be filled in. Additional debugging

View File

@ -69,7 +69,9 @@ static bool RunTests() {
SourceLineResolver resolver; SourceLineResolver resolver;
ASSERT_TRUE(resolver.LoadModule("module1", testdata_dir + "/module1.out")); ASSERT_TRUE(resolver.LoadModule("module1", testdata_dir + "/module1.out"));
ASSERT_TRUE(resolver.HasModule("module1"));
ASSERT_TRUE(resolver.LoadModule("module2", testdata_dir + "/module2.out")); ASSERT_TRUE(resolver.LoadModule("module2", testdata_dir + "/module2.out"));
ASSERT_TRUE(resolver.HasModule("module2"));
StackFrame frame; StackFrame frame;
StackFrameInfo frame_info; StackFrameInfo frame_info;
@ -112,8 +114,11 @@ static bool RunTests() {
ASSERT_FALSE(resolver.LoadModule("module3", ASSERT_FALSE(resolver.LoadModule("module3",
testdata_dir + "/module3_bad.out")); testdata_dir + "/module3_bad.out"));
ASSERT_FALSE(resolver.HasModule("module3"));
ASSERT_FALSE(resolver.LoadModule("module4", ASSERT_FALSE(resolver.LoadModule("module4",
testdata_dir + "/invalid-filename")); testdata_dir + "/invalid-filename"));
ASSERT_FALSE(resolver.HasModule("module4"));
ASSERT_FALSE(resolver.HasModule("invalid-module"));
return true; return true;
} }

View File

@ -78,14 +78,13 @@ void Stackwalker::Walk(StackFrames *frames) {
if (module) { if (module) {
frame->module_name = *(module->GetName()); frame->module_name = *(module->GetName());
frame->module_base = module->base_address(); frame->module_base = module->base_address();
if (modules_ && supplier_) { if (!resolver.HasModule(frame->module_name) && supplier_) {
string symbol_file = string symbol_file = supplier_->GetSymbolFile(module);
supplier_->GetSymbolFile(module);
if (!symbol_file.empty()) { if (!symbol_file.empty()) {
resolver.LoadModule(*(module->GetName()), symbol_file); resolver.LoadModule(frame->module_name, symbol_file);
resolver.FillSourceLineInfo(frame.get(), frame_info.get());
} }
} }
resolver.FillSourceLineInfo(frame.get(), frame_info.get());
} }
} }