llvm / llvm/llvm-project

[lldb] `Resource deadlock avoided` exception in `lldb::SBFrame::IsValid` in `ScriptedFrameProvider`

Open
#194,108 6 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

I am running into the following assertion while trying to use a `ScriptedFrameProvider`.
On git commit 6dd373f8aaab96b293a1374d3039b3c658b292e1.
On Ubuntu 24.04.

```
terminate called after throwing an instance of 'std::system_error'
what(): Resource deadlock avoided
LLDB diagnostics will be written to /tmp/diagnostics-a28e71
Please include the directory content when filing a bug report
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
#0 0x0000631423eedfa2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/avogelsgesang/Documents/llvm-project/llvm/lib/Support/Unix/Signals.inc:884:3
#1 0x0000631423eeb0a4 llvm::sys::RunSignalHandlers() /home/avogelsgesang/Documents/llvm-project/llvm/lib/Support/Signals.cpp:108:20
#2 0x0000631423eeb9d1 SignalHandler(int, siginfo_t*, void*) /home/avogelsgesang/Documents/llvm-project/llvm/lib/Support/Unix/Signals.inc:448:14
#3 0x000076b11c845330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
#4 0x000076b11c92728d syscall ./misc/../sysdeps/unix/sysv/linux/x86_64/syscall.S:38:0
#5 0x000076b11e06e3bb SignalHandler(int, siginfo_t*, void*) /home/avogelsgesang/Documents/llvm-project/llvm/lib/Support/Unix/Signals.inc:449:3
#6 0x000076b11c845330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
#7 0x000076b11c89eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#8 0x000076b11c89eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#9 0x000076b11c89eb2c pthread_kill ./nptl/pthread_kill.c:89:10
#10 0x000076b11c84527e raise ./signal/../sysdeps/posix/raise.c:27:6
#11 0x000076b11c8288ff abort ./stdlib/abort.c:81:7
#12 0x000076b11cca5ff5 (/lib/x86_64-linux-gnu/libstdc++.so.6+0xa5ff5)
#13 0x000076b11ccbb01a (/lib/x86_64-linux-gnu/libstdc++.so.6+0xbb01a)
#14 0x000076b11cca5a55 std::unexpected() (/lib/x86_64-linux-gnu/libstdc++.so.6+0xa5a55)
#15 0x000076b11ccbb2d1 (/lib/x86_64-linux-gnu/libstdc++.so.6+0xbb2d1)
#16 0x000076b11ccaa2a3 std::__throw_system_error(int) (/lib/x86_64-linux-gnu/libstdc++.so.6+0xaa2a3)
#17 0x000076b11daaf3f9 (/home/avogelsgesang/Documents/llvm-project/build/bin/../lib/liblldb.so.23.0git+0xaaf3f9)
#18 0x000076b11da57802 std::__shared_ptr::operator bool() const /usr/include/c++/13/bits/shared_ptr_base.h:1670:16
#19 0x000076b11da57802 lldb_private::ExecutionContextRef::GetFrameSP() const /home/avogelsgesang/Documents/llvm-project/lldb/source/Target/ExecutionContext.cpp:689:73
#20 0x000076b11da57cca lldb_private::GetStoppedExecutionContext(lldb_private::ExecutionContextRef const*) /home/avogelsgesang/Documents/llvm-project/lldb/source/Target/ExecutionContext.cpp:164:17
#21 0x000076b11da58254 lldb_private::GetStoppedExecutionContext(std::shared_ptr const&) /home/avogelsgesang/Documents/llvm-project/lldb/source/Target/ExecutionContext.cpp:134:1
#22 0x000076b11d682323 lldb::SBFrame::operator bool() const /home/avogelsgesang/Documents/llvm-project/lldb/source/API/SBFrame.cpp:104:3
#23 0x000076b11d68254d lldb::SBFrame::IsValid() const /home/avogelsgesang/Documents/llvm-project/lldb/source/API/SBFrame.cpp:99:1
#24 0x000076b11d76a5a5 SWIG_Python_Thread_Allow::end() /home/avogelsgesang/Documents/llvm-project/build/tools/lldb/bindings/python/LLDBWrapPython.cpp:1040:73
#25 0x000076b11d76a5a5 SWIG_Python_Thread_Allow::end() /home/avogelsgesang/Documents/llvm-project/build/tools/lldb/bindings/python/LLDBWrapPython.cpp:1040:15
#26 0x000076b11d76a5a5 _wrap_SBFrame_IsValid /home/avogelsgesang/Documents/llvm-project/build/tools/lldb/bindings/python/LLDBWrapPython.cpp:37212:5
#27 0x000076b11bf235fc _PyEval_EvalFrameDefault (/lib/x86_64-linux-gnu/libpython3.12.so.1.0+0x1235fc)
#28 0x000076b11bf867bd (/lib/x86_64-linux-gnu/libpython3.12.so.1.0+0x1867bd)
#29 0x000076b11bf83adc (/lib/x86_64-linux-gnu/libpython3.12.so.1.0+0x183adc)
#30 0x000076b11bf8426b PyObject_CallMethod (/lib/x86_64-linux-gnu/libpython3.12.so.1.0+0x18426b)
#31 0x000076b11deb5756 llvm::Expected lldb_private::python::PythonObject::CallMethod(char const*, unsigned int const&) const /home/avogelsgesang/Documents/llvm-project/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h:312:5
#32 0x000076b11deb5756 auto std::shared_ptr lldb_private::ScriptedPythonInterface::Dispatch, unsigned int&>(llvm::StringRef, lldb_private::Status&, unsigned int&)::'lambda'(auto&&...)::operator()(auto&&...) const /home/avogelsgesang/Documents/llvm-project/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h:532:34
#33 0x000076b11deb5756 std::shared_ptr std::__invoke_impl lldb_private::ScriptedPythonInterface::Dispatch, unsigned int&>(llvm::StringRef, lldb_private::Status&, unsigned int&)::'lambda'(auto&&...), unsigned int&>(std::__invoke_other, std::shared_ptr lldb_private::ScriptedPythonInterface::Dispatch, unsigned int&>(llvm::StringRef, lldb_private::Status&, unsigned int&)::'lambda'(auto&&...)&&, unsigned int&) /usr/include/c++/13/bits/invoke.h:61:36
#34 0x000076b11deb5756 std::__invoke_result, unsigned int&>::type std::__invoke lldb_private::ScriptedPythonInterface::Dispatch, unsigned int&>(llvm::StringRef, lldb_private::Status&, unsigned int&)::'lambda'(auto&&...), unsigned int&>(std::shared_ptr&&, unsigned int&) /usr/include/c++/13/bits/invoke.h:96:40
#35 0x000076b11deb5756 decltype(auto) std::__apply_impl lldb_private::ScriptedPythonInterface::Dispatch, unsigned int&>(llvm::StringRef, lldb_private::Status&, unsigned int&)::'lambda'(auto&&...), std::tuple&, 0ul>(std::shared_ptr&&, std::tuple&, std::integer_sequence) /usr/include/c++/13/tuple:2302:27
#36 0x000076b11deb5756 decltype(auto) std::apply lldb_private::ScriptedPythonInterface::Dispatch, unsigned int&>(llvm::StringRef, lldb_private::Status&, unsigned int&)::'lambda'(auto&&...), std::tuple&>(std::shared_ptr&&, std::tuple&) /usr/include/c++/13/tuple:2313:31
#37 0x000076b11deb5756 std::shared_ptr lldb_private::ScriptedPythonInterface::Dispatch, unsigned int&>(llvm::StringRef, lldb_private::Status&, unsigned int&) /home/avogelsgesang/Documents/llvm-project/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h:529:15
#38 0x000076b11deb5ba7 std::__shared_ptr::__shared_ptr(std::__shared_ptr const&) /usr/include/c++/13/bits/shared_ptr_base.h:1522:7
#39 0x000076b11deb5ba7 std::shared_ptr::shared_ptr(std::shared_ptr const&) /usr/include/c++/13/bits/shared_ptr.h:204:7
#40 0x000076b11deb5ba7 lldb_private::ScriptedFrameProviderPythonInterface::GetFrameAtIndex(unsigned int) /home/avogelsgesang/Documents/llvm-project/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedFrameProviderPythonInterface.cpp:93:52
#41 0x000076b11df98159 std::__shared_ptr::operator bool() const /usr/include/c++/13/bits/shared_ptr_base.h:1670:16
#42 0x000076b11df98159 lldb_private::ScriptedFrameProvider::GetFrameAtIndex(unsigned int) /home/avogelsgesang/Documents/llvm-project/lldb/source/Plugins/SyntheticFrameProvider/ScriptedFrameProvider/ScriptedFrameProvider.cpp:172:8
#43 0x000076b11dab1403 lldb_private::SyntheticStackFrameList::FetchFramesUpTo(unsigned int, InterruptionControl) /home/avogelsgesang/Documents/llvm-project/lldb/source/Target/StackFrameList.cpp:104:7
#44 0x000076b11daad790 lldb_private::StackFrameList::GetFramesUpTo(unsigned int, InterruptionControl) /home/avogelsgesang/Documents/llvm-project/lldb/source/Target/StackFrameList.cpp:470:36
#45 0x000076b11daad843 lldb_private::StackFrameList::GetFrameAtIndex(unsigned int) /home/avogelsgesang/Documents/llvm-project/lldb/source/Target/StackFrameList.cpp:715:3
#46 0x000076b11daadb14 std::__shared_ptr::operator bool() const /usr/include/c++/13/bits/shared_ptr_base.h:1670:16
#47 0x000076b11daadb14 lldb_private::StackFrameList::IsNextFrameHidden(lldb_private::StackFrame&) /home/avogelsgesang/Documents/llvm-project/lldb/source/Target/StackFrameList.cpp:966:8
#48 0x000076b11daadbeb lldb_private::StackFrameList::GetFrameMarker[abi:cxx11](std::shared_ptr, std::shared_ptr, bool) /home/avogelsgesang/Documents/llvm-project/lldb/source/Target/StackFrameList.cpp:991:3
#49 0x000076b11daae337 std::__cxx11::basic_string, std::allocator>::_M_data() const /usr/include/c++/13/bits/basic_string.h:223:28
#50 0x000076b11daae337 std::__cxx11::basic_string, std::allocator>::_M_is_local() const /usr/include/c++/13/bits/basic_string.h:264:13
#51 0x000076b11daae337 std::__cxx11::basic_string, std::allocator>::operator=(std::__cxx11::basic_string, std::allocator>&&) /usr/include/c++/13/bits/basic_string.h:858:18
#52 0x000076b11daae337 lldb_private::StackFrameList::GetStatus(lldb_private::Stream&, unsigned int, unsigned int, bool, unsigned int, bool, bool, bool, bool) /home/avogelsgesang/Documents/llvm-project/lldb/source/Target/StackFrameList.cpp:1030:49
#53 0x000076b11db0196e std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() /usr/include/c++/13/bits/shared_ptr_base.h:1070:6
#54 0x000076b11db0196e std::__shared_ptr::~__shared_ptr() /usr/include/c++/13/bits/shared_ptr_base.h:1524:7
#55 0x000076b11db0196e std::shared_ptr::~shared_ptr() /usr/include/c++/13/bits/shared_ptr.h:175:11
#56 0x000076b11db0196e lldb_private::Thread::GetStatus(lldb_private::Stream&, unsigned int, unsigned int, unsigned int, bool, bool, bool) /home/avogelsgesang/Documents/llvm-project/lldb/source/Target/Thread.cpp:2143:41
#57 0x000076b11d88dc46 std::unique_ptr>::~unique_ptr() /usr/include/c++/13/bits/unique_ptr.h:403:2
#58 0x000076b11d88dc46 lldb_private::Debugger::HandleThreadEvent(std::shared_ptr const&) /home/avogelsgesang/Documents/llvm-project/lldb/source/Core/Debugger.cpp:2125:49
#59 0x000076b11d89a51b std::__shared_ptr::operator bool() const /usr/include/c++/13/bits/shared_ptr_base.h:1670:16
#60 0x000076b11d89a51b lldb_private::Debugger::DefaultEventHandler() /home/avogelsgesang/Documents/llvm-project/lldb/source/Core/Debugger.cpp:2285:65
#61 0x000076b11d995a6c std::function::operator()() const /usr/include/c++/13/bits/std_function.h:591:9
#62 0x000076b11d995a6c lldb_private::HostNativeThreadBase::ThreadCreateTrampoline(void*) /home/avogelsgesang/Documents/llvm-project/lldb/source/Host/common/HostNativeThreadBase.cpp:62:23
#63 0x000076b11c89caa4 start_thread ./nptl/pthread_create.c:447:8
#64 0x000076b11c929c6c clone3 ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:80:0
./repro-crash.sh: line 24: 405025 Aborted (core dumped) "$LLDB" -o "breakpoint set --file async-task-example.cpp --line 4" -o "run" -o "command script import repro_min.py" -o "bt" -o "quit" "$BUILD_DIR/a.out"
```

----

**Repro**

1. take `async-task-library.hpp` from https://clang.llvm.org/docs/DebuggingCoroutines.html#async-stack-traces

2. Save the following in `repro.cpp`

```cpp
#include "async-task-library.hpp"

static task f() {
co_return 0;
}

int main() {
f().syncStart();
}
```

3. Save the following in `frame_provider.py`

```python
from lldb.plugins.scripted_frame_provider import ScriptedFrameProvider

class MinProvider(ScriptedFrameProvider):
@staticmethod
def get_description():
return "min repro"

def get_frame_at_index(self, index):
bool(self.input_frames[0])
return index

def __lldb_init_module(debugger, internal_dict):
debugger.HandleCommand(f"target frame-provider register -C {__name__}.MinProvider")
```

4. Run the script

```bash
#!/bin/bash
# Reproducer for LLDB crash when running `bt` after importing the
# repro_min.py frame provider.

set -eu

BUILD_DIR="$(mktemp -d)"
trap 'rm -rf "$BUILD_DIR"' EXIT

clang++ -std=c++20 -g -O0 -fno-omit-frame-pointer \
repro.cpp \
-o "$BUILD_DIR/a.out"

lldb \
-o "breakpoint set --file repro.cpp --line 4" \
-o "run" \
-o "command script import repro_min.py" \
-o "bt" \
-o "quit" \
"$BUILD_DIR/a.out"
```

Contributor guide

Open the contributing guide

Research direction

Reproduce the ScriptedFrameProvider failure on Ubuntu 24.04 at commit 6dd373f8aaab96b293a1374d3039b3c658b292e1, including the reported diagnostics directory. Start with lldb/source/API/SBFrame.cpp, lldb/source/Target/ExecutionContext.cpp, ScriptedFrameProvider.cpp, and ScriptedFrameProviderPythonInterface.cpp, following the SBFrame::IsValid call path. Done means the reproducer no longer terminates with Resource deadlock avoided and an LLDB regression test covers it.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, python, ubuntu
Domain
devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.