Skip adding value lines for accidental matches.

If the value_line regex matches, and the symbol file happens to exist
as a directory, we'd call addr2line and crash. Fix this so that calling
addr2line on a directory doesn't happen.

There isn't an easy way to test this, but I added a single new unit test. The
real test was to use a tombstone file that used to crash, but no longer crashes.

Test: Wrote new unit test, ran over a tombstone file that used to crash.
Change-Id: I4331e3b032cee8d697d1b7f409638750c61971d6
This commit is contained in:
Christopher Ferris
2016-09-19 13:24:37 -07:00
parent cc3a31fbe6
commit 5f1b4f0d9e
2 changed files with 27 additions and 13 deletions

View File

@@ -409,6 +409,8 @@ class TraceConverter:
else: else:
info = symbol.SymbolInformation(area, value) info = symbol.SymbolInformation(area, value)
(source_symbol, source_location, object_symbol_with_offset) = info.pop() (source_symbol, source_location, object_symbol_with_offset) = info.pop()
# If there is no information, skip this.
if source_symbol or source_location or object_symbol_with_offset:
if not source_symbol: if not source_symbol:
if symbol_present: if symbol_present:
source_symbol = symbol.CallCppFilt(symbol_name) source_symbol = symbol.CallCppFilt(symbol_name)
@@ -499,5 +501,13 @@ class LongASANStackTests(unittest.TestCase):
self.assertGreater(trace_line_count, 10) self.assertGreater(trace_line_count, 10)
tc.PrintOutput(tc.trace_lines, tc.value_lines) tc.PrintOutput(tc.trace_lines, tc.value_lines)
class ValueLinesTest(unittest.TestCase):
def test_value_line_skipped(self):
tc = TraceConverter()
symbol.SetAbi(["ABI: 'arm'"])
tc.UpdateAbiRegexes()
tc.ProcessLine(" 12345678 00001000 .")
self.assertEqual([], tc.value_lines)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@@ -189,6 +189,10 @@ def CallAddr2LineForSet(lib, unique_addrs):
if not os.path.exists(symbols): if not os.path.exists(symbols):
return None return None
# Make sure the symbols path is not a directory.
if os.path.isdir(symbols):
return None
cmd = [ToolPath("addr2line"), "--functions", "--inlines", cmd = [ToolPath("addr2line"), "--functions", "--inlines",
"--demangle", "--exe=" + symbols] "--demangle", "--exe=" + symbols]
child = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE) child = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)