llvm / llvm/llvm-project

[lldb] Duplicate frame recognisers when re-running target

Open
#166,341 2 comments 0 reactions 0 assignees View on GitHub
lldb
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

Split out from: https://github.com/llvm/llvm-project/pull/166157

Reproducer:
```
$ lldb a.out -o "b main" -o run
(lldb) frame recognizer list
9: ObjC Exception Throw StackFrame Recognizer, module libobjc.A.dylib, demangled symbol objc_exception_throw
8: SwiftUI Changed Properties StackFrame Recognizer, demangled symbol regex \.body\(content: SwiftUI\._ViewModifier_Content
7: SwiftUI Changed Properties StackFrame Recognizer, demangled symbol regex body\.getter
6: Swift hidden frame recognizer, mangled symbol regex ^\$s.*
5: Swift runtime instrumentation frame recognizer, demangled (no args) symbol regex _swift_runtime_on_report
4: Swift runtime failure frame recognizer, demangled (no args) symbol regex Swift runtime failure
3: libc++ frame recognizer, demangled (no args) symbol regex ^std::__[^:]*::
2: abort_with_payload StackFrame Recognizer, module libsystem_kernel.dylib, demangled symbol __abort_with_payload
1: Verbose Trap StackFrame Recognizer, demangled symbol regex ^(__clang_trap_msg|Bounds check failed|Pointer Check runtime failure)
0: Assert StackFrame Recognizer, module libsystem_kernel.dylib, demangled symbol __pthread_kill

(lldb) run
(lldb) frame recognizer list
19: ObjC Exception Throw StackFrame Recognizer, module libobjc.A.dylib, demangled symbol objc_exception_throw
18: SwiftUI Changed Properties StackFrame Recognizer, demangled symbol regex \.body\(content: SwiftUI\._ViewModifier_Content
17: SwiftUI Changed Properties StackFrame Recognizer, demangled symbol regex body\.getter
16: Swift hidden frame recognizer, mangled symbol regex ^\$s.*
15: Swift runtime instrumentation frame recognizer, demangled (no args) symbol regex _swift_runtime_on_report
14: Swift runtime failure frame recognizer, demangled (no args) symbol regex Swift runtime failure
13: libc++ frame recognizer, demangled (no args) symbol regex ^std::__[^:]*::
12: abort_with_payload StackFrame Recognizer, module libsystem_kernel.dylib, demangled symbol __abort_with_payload
11: Verbose Trap StackFrame Recognizer, demangled symbol regex ^(__clang_trap_msg|Bounds check failed|Pointer Check runtime failure)
10: Assert StackFrame Recognizer, module libsystem_kernel.dylib, demangled symbol __pthread_kill
9: ObjC Exception Throw StackFrame Recognizer, module libobjc.A.dylib, demangled symbol objc_exception_throw
8: SwiftUI Changed Properties StackFrame Recognizer, demangled symbol regex \.body\(content: SwiftUI\._ViewModifier_Content
7: SwiftUI Changed Properties StackFrame Recognizer, demangled symbol regex body\.getter
6: Swift hidden frame recognizer, mangled symbol regex ^\$s.*
5: Swift runtime instrumentation frame recognizer, demangled (no args) symbol regex _swift_runtime_on_report
4: Swift runtime failure frame recognizer, demangled (no args) symbol regex Swift runtime failure
3: libc++ frame recognizer, demangled (no args) symbol regex ^std::__[^:]*::
2: abort_with_payload StackFrame Recognizer, module libsystem_kernel.dylib, demangled symbol __abort_with_payload
1: Verbose Trap StackFrame Recognizer, demangled symbol regex ^(__clang_trap_msg|Bounds check failed|Pointer Check runtime failure)
0: Assert StackFrame Recognizer, module libsystem_kernel.dylib, demangled symbol __pthread_kill
```

Observe that on every re-run in the same LLDB session we'll re-register (but not clear the previous) frame recognizers.

It would be good to have a mechanism for not allowing to add duplicate recognizers. Ideally we would turn the [`deque`](https://github.com/llvm/llvm-project/blob/f74e90961f51c9437461007c89b037be41e4e887/lldb/include/lldb/Target/StackFrameRecognizer.h#L163) of recognizers into something like a `UniqueVector`. That would help with the goal mentioned in https://github.com/llvm/llvm-project/pull/166157 where we want a common `CLanguageRuntime` plugin that registers some of the frame recognisers common to all the C-language runtime plugins. But we want to make sure the recognizers only get registered once, and not for every runtime that derives from the `CLanguageRuntime`. `UniqueVector` isn't quite the right fit because it doesn't allow removal of elements.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.