Files
Med Ismail Bennani 1a50fab6e6 [lldb/crashlog] Fix inlined frames in crashlog scripted process (#191132)
When loading a crashlog using scripted process, inlined frames get lost.

This happens because `ScriptedThread::LoadArtificialStackFrames` creates
all frames as concrete frames via `SetFrameAtIndex`, completely
bypassing the inline frame synthesis that
`StackFrameList::FetchFramesUpTo` normally performs using
`GetParentOfInlinedScope`. Since two crashlog frames share the same PC
when one is inlined into the other, `CalculateSymbolContext` resolves
both to the innermost inlined scope, which causes the containing
function to be dropped from the backtrace.

This patch fixes the issue in two parts:
- On the Python side, `resolve_stackframes` now skips frames whose PC
matches the next frame's PC. These are inlined frames that LLDB will
synthesize from debug info when it processes the concrete frames we
provide. Indices are renumbered accordingly, and `len(frames) == 0` is
used for first-frame detection.
- On the C++ side, `LoadArtificialStackFrames` now replicates the inline
synthesis loop from `FetchFramesUpTo`: after creating each concrete
frame, it calls `GetParentOfInlinedScope` in a loop and creates a
`StackFrame` for each inlined parent scope.

rdar://154981041

Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
2026-04-13 16:29:17 -07:00

20 lines
932 B
Plaintext

# REQUIRES: python, native && system-darwin
# RUN: %clang_host -g %S/Inputs/inline_test.c -o %t.out
# RUN: cp %S/Inputs/a.out.inline.crash %t.crash
# RUN: %python %S/patch-crashlog.py --binary %t.out --crashlog %t.crash --offsets '{"main":20, "bar":16}'
# RUN: %lldb %t.out \
# RUN: -o 'command script import lldb.macosx.crashlog' \
# RUN: -o 'crashlog -a -i %t.crash' \
# RUN: -o 'thread backtrace' 2>&1 | FileCheck %s
# CHECK: "crashlog" {{.*}} commands have been installed, use the "--help" options on these commands
# Verify that the inlined frame (foo) and its containing function (bar) both
# appear in the backtrace, even though the crashlog listed them at the same PC.
# CHECK: (lldb) thread backtrace
# CHECK-NEXT: * thread #1
# CHECK-NEXT: * frame #0: {{.*}}out`foo{{.*}} [synthetic] [inlined]
# CHECK-NEXT: frame #1: {{.*}}out`bar
# CHECK: frame #{{[0-9]+}}: {{.*}}out`main{{.*}} [synthetic]