Commit efe4f93c authored by Lucian Grijincu's avatar Lucian Grijincu Committed by facebook-github-bot-0

folly: symbolizer: dwarf: don't fallback to linear scan if address missing from .debug_aranges

Summary:Presence of .debug_aranges implies user expects fast address lookup.
Some addresses might not be avaialble in .debug_aranges.

Don't do slow lookup in .debug_info, as it can lead to unexpected slowdowns.

override-unit-failures

Reviewed By: philippv

Differential Revision: D2965323

fb-gh-sync-id: 405daefd57cdff4344fd231c5f5b7ff4dcd9df8c
shipit-source-id: 405daefd57cdff4344fd231c5f5b7ff4dcd9df8c
parent d45626d0
......@@ -573,19 +573,22 @@ bool Dwarf::findAddress(uintptr_t address, LocationInfo& locationInfo) const {
// Fast path: find the right .debug_info entry by looking up the
// address in .debug_aranges.
uint64_t offset = 0;
if (findDebugInfoOffset(address, aranges_, offset)) {
if (!findDebugInfoOffset(address, aranges_, offset)) {
// NOTE: clang doesn't generate entries in .debug_aranges for
// some functions, but always generates .debug_info entries.
// We could read them from .debug_info but that's too slow.
// If .debug_aranges is present fast address lookup is assumed.
return false;
}
// Read compilation unit header from .debug_info
folly::StringPiece infoEntry(info_);
infoEntry.advance(offset);
findLocation(address, infoEntry, locationInfo);
return true;
}
}
// Slow path (linear scan): Iterate over all .debug_info entries
// and look for the address in each compilation unit.
// NOTE: clang doesn't generate entries in .debug_aranges for some
// functions, but always generates .debug_info entries.
folly::StringPiece infoEntry(info_);
while (!infoEntry.empty() && !locationInfo.hasFileAndLine) {
findLocation(address, infoEntry, locationInfo);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment