Skip to content

Commit 7aa8d35

Browse files
[compiler-rt] Fix frame numbering for unparsable frames.
This can happen when JIT code is run, and we can't symbolize those frames, but they should remain numbered in the stack.
1 parent bf94c8d commit 7aa8d35

File tree

1 file changed

+21
-13
lines changed

1 file changed

+21
-13
lines changed

compiler-rt/lib/asan/scripts/asan_symbolize.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -507,20 +507,29 @@ def symbolize_address(self, addr, binary, offset, arch):
507507
assert result
508508
return result
509509

510-
def get_symbolized_lines(self, symbolized_lines, inc_frame_counter=True):
510+
def get_symbolized_lines(self, symbolized_lines):
511511
if not symbolized_lines:
512-
if inc_frame_counter:
513-
self.frame_no += 1
514-
return [self.current_line]
515-
else:
516-
assert inc_frame_counter
517-
result = []
518-
for symbolized_frame in symbolized_lines:
519-
result.append(
520-
" #%s %s" % (str(self.frame_no), symbolized_frame.rstrip())
512+
# If it is an unparsable frame, but contains a frame counter and address
513+
# replace the frame counter so the stack is still consistent.
514+
unknown_stack_frame_format = r"^( *#([0-9]+) +)(0x[0-9a-f]+) +.*"
515+
match = re.match(unknown_stack_frame_format, self.current_line)
516+
if match:
517+
rewritten_line = (
518+
self.current_line[: match.start(2)]
519+
+ str(self.frame_no)
520+
+ self.current_line[match.end(2) :]
521521
)
522522
self.frame_no += 1
523-
return result
523+
return [rewritten_line]
524+
# Not a frame line so don't increment the frame counter.
525+
return [self.current_line]
526+
result = []
527+
for symbolized_frame in symbolized_lines:
528+
result.append(
529+
" #%s %s" % (str(self.frame_no), symbolized_frame.rstrip())
530+
)
531+
self.frame_no += 1
532+
return result
524533

525534
def process_logfile(self):
526535
self.frame_no = 0
@@ -546,8 +555,7 @@ def process_line_posix(self, line):
546555
match = re.match(stack_trace_line_format, line)
547556
if not match:
548557
logging.debug('Line "{}" does not match regex'.format(line))
549-
# Not a frame line so don't increment the frame counter.
550-
return self.get_symbolized_lines(None, inc_frame_counter=False)
558+
return self.get_symbolized_lines(None)
551559
logging.debug(line)
552560
_, frameno_str, addr, binary, offset = match.groups()
553561

0 commit comments

Comments
 (0)