[lldb] Duplicate frame recognisers when re-running target
- 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
Assessment
This issue has not been assessed yet.