<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/60408>60408</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            lldb leaves inferior stopped at breakpoint even after detaching
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          godlygeek
      </td>
    </tr>
</table>

<pre>
    Given this C++11 program in a file called `test.cpp`:
```cpp
#include <thread>
#include <vector>

#include <unistd.h>

void getpid_eventually()
{
    sleep(2);
    getpid();
}

int main()
{
    std::vector<std::thread> threads;
    for (int i = 0; i < 5; ++i) {
        threads.emplace_back(getpid_eventually);
    }
 for (auto& thread: threads) {
        thread.join();
 }
}
```

Compiled with `g++ -std=c++11 test.cpp -lpthread -o test`

This `lldb` command line consistently results in the inferior process remaining in a stopped state even after `lldb` has detached and exited:

```sh
./test & sleep 1; lldb --batch -o "br set -b getpid -C 'breakpoint disable' -C 'thread list'"  -o "continue" -p $! 
```

That is, run the executable in the background, sleep 1 second (until threads have been spawned and are blocked in `sleep`), and then attach to it in batch mode, set a breakpoint with commands, and continue.

The full output is:
```log
(lldb) process attach --pid 16532 [35/6718]
Process 16532 stopped
* thread #1, name = 'test', stop reason = signal SIGSTOP
    frame #0: 0x00007fe7a656b017 libpthread.so.0`pthread_join + 167
libpthread.so.0`pthread_join:
->  0x7fe7a656b017 <+167>: cmpl $0x0, (%rdi)
    0x7fe7a656b01a <+170>: jne    0x7fe7a656b00e            ; <+158>
    0x7fe7a656b01c <+172>: movl   %r8d, %edi
    0x7fe7a656b01f <+175>: callq  0x7fe7a65704a0            ; __pthread_disable_asynccancel
 thread #2, name = 'test', stop reason = signal SIGSTOP
    frame #0: 0x00007fe7a5a399fd libc.so.6`__nanosleep + 45
libc.so.6`__nanosleep:
-> 0x7fe7a5a399fd <+45>: movq   (%rsp), %rdi
    0x7fe7a5a39a01 <+49>: movq %rax, %rdx
    0x7fe7a5a39a04 <+52>: callq  0x7fe7a5a80890            ; __libc_disable_asynccancel
    0x7fe7a5a39a09 <+57>: movq   %rdx, %rax
 thread #3, name = 'test', stop reason = signal SIGSTOP
    frame #0: 0x00007fe7a5a399fd libc.so.6`__nanosleep + 45
libc.so.6`__nanosleep:
-> 0x7fe7a5a399fd <+45>: movq   (%rsp), %rdi
    0x7fe7a5a39a01 <+49>: movq %rax, %rdx
    0x7fe7a5a39a04 <+52>: callq  0x7fe7a5a80890            ; __libc_disable_asynccancel
    0x7fe7a5a39a09 <+57>: movq   %rdx, %rax
 thread #4, name = 'test', stop reason = signal SIGSTOP
    frame #0: 0x00007fe7a5a399fd libc.so.6`__nanosleep + 45
libc.so.6`__nanosleep:
-> 0x7fe7a5a399fd <+45>: movq   (%rsp), %rdi
    0x7fe7a5a39a01 <+49>: movq %rax, %rdx
    0x7fe7a5a39a04 <+52>: callq  0x7fe7a5a80890            ; __libc_disable_asynccancel
    0x7fe7a5a39a09 <+57>: movq   %rdx, %rax
 thread #5, name = 'test', stop reason = signal SIGSTOP
    frame #0: 0x00007fe7a5a399fd libc.so.6`__nanosleep + 45
libc.so.6`__nanosleep:
-> 0x7fe7a5a399fd <+45>: movq   (%rsp), %rdi
    0x7fe7a5a39a01 <+49>: movq %rax, %rdx
    0x7fe7a5a39a04 <+52>: callq  0x7fe7a5a80890            ; __libc_disable_asynccancel
    0x7fe7a5a39a09 <+57>: movq   %rdx, %rax
 thread #6, name = 'test', stop reason = signal SIGSTOP
    frame #0: 0x00007fe7a5a399fd libc.so.6`__nanosleep + 45
libc.so.6`__nanosleep:
-> 0x7fe7a5a399fd <+45>: movq   (%rsp), %rdi
    0x7fe7a5a39a01 <+49>: movq %rax, %rdx
    0x7fe7a5a39a04 <+52>: callq  0x7fe7a5a80890            ; __libc_disable_asynccancel
    0x7fe7a5a39a09 <+57>: movq   %rdx, %rax
Executable module set to "/home/mwoznisk/sandbox/lldb_breakpoint_after_detach/test".
Architecture set to: x86_64-unknown-linux-gnu.
(lldb) breakpoint set -b getpid -C 'breakpoint disable' -C 'thread list'
Breakpoint 1: 2 locations.
(lldb) continue
(lldb)  breakpoint disable
All breakpoints disabled. (1 breakpoints)
(lldb)  thread list
Process 16532 stopped
* thread #1: tid = 16532, 0x00007fe7a656b017 libpthread.so.0`pthread_join + 167, name = 'test'
  thread #2: tid = 16534, 0x00007fe7a5a3a9a0 libc.so.6`getpid, name = 'test', stop reason = breakpoint 1.
  thread #3: tid = 16535, 0x00007fe7a5a3a9a0 libc.so.6`getpid, name = 'test', stop reason = breakpoint 1.
  thread #4: tid = 16536, 0x00007fe7a5a3a9a0 libc.so.6`getpid, name = 'test', stop reason = breakpoint 1.
  thread #5: tid = 16537, 0x00007fe7a5a3a9a0 libc.so.6`getpid, name = 'test', stop reason = breakpoint 1.
  thread #6: tid = 16538, 0x00007fe7a5a3a9a0 libc.so.6`getpid, name = 'test', stop reason = breakpoint 1.
Process 16532 resuming
Process 16532 stopped
* thread #2, name = 'test', stop reason = breakpoint 1.
 frame #0: 0x00007fe7a5a3a9a0 libc.so.6`getpid
libc.so.6`getpid:
-> 0x7fe7a5a3a9a0 <+0>:  movl   %fs:0x2d4, %edx
    0x7fe7a5a3a9a8 <+8>: cmpl   $0x0, %edx
    0x7fe7a5a3a9ab <+11>: movl   %edx, %eax
 0x7fe7a5a3a9ad <+13>: jle    0x7fe7a5a3a9b1            ; <+17>
  thread #3, name = 'test', stop reason = breakpoint 1.
    frame #0: 0x00007fe7a5a3a9a0 libc.so.6`getpid
libc.so.6`getpid:
-> 0x7fe7a5a3a9a0 <+0>:  movl   %fs:0x2d4, %edx
    0x7fe7a5a3a9a8 <+8>: cmpl   $0x0, %edx
    0x7fe7a5a3a9ab <+11>: movl   %edx, %eax
 0x7fe7a5a3a9ad <+13>: jle    0x7fe7a5a3a9b1            ; <+17>
  thread #4, name = 'test', stop reason = breakpoint 1.
    frame #0: 0x00007fe7a5a3a9a0 libc.so.6`getpid
libc.so.6`getpid:
-> 0x7fe7a5a3a9a0 <+0>:  movl   %fs:0x2d4, %edx
    0x7fe7a5a3a9a8 <+8>: cmpl   $0x0, %edx
    0x7fe7a5a3a9ab <+11>: movl   %edx, %eax
 0x7fe7a5a3a9ad <+13>: jle    0x7fe7a5a3a9b1            ; <+17>
  thread #5, name = 'test', stop reason = breakpoint 1.
    frame #0: 0x00007fe7a5a3a9a0 libc.so.6`getpid
libc.so.6`getpid:
-> 0x7fe7a5a3a9a0 <+0>:  movl   %fs:0x2d4, %edx
    0x7fe7a5a3a9a8 <+8>: cmpl   $0x0, %edx
    0x7fe7a5a3a9ab <+11>: movl   %edx, %eax
 0x7fe7a5a3a9ad <+13>: jle    0x7fe7a5a3a9b1            ; <+17>
  thread #6, name = 'test', stop reason = breakpoint 1.
    frame #0: 0x00007fe7a5a3a9a0 libc.so.6`getpid
libc.so.6`getpid:
-> 0x7fe7a5a3a9a0 <+0>:  movl   %fs:0x2d4, %edx
    0x7fe7a5a3a9a8 <+8>: cmpl   $0x0, %edx
    0x7fe7a5a3a9ab <+11>: movl   %edx, %eax
 0x7fe7a5a3a9ad <+13>: jle    0x7fe7a5a3a9b1            ; <+17>
[2]  + suspended (signal)  ./test
```

After which, listing the jobs in my `zsh` shell shows:
```
[2]  + suspended (signal) ./test
```
until I foreground it or prod it with a SIGCONT.

This reproduces in lldb 10.0.0, lldb 15.0.4, and in a debug build of `main`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWltv27gS_jXMy8ACRV1sP_ghceqiL2cXaN8NShxbbGhSK1KJs7_-gNTFsuMEmz3Y00WQoEAVcTi3b2ao4YRbK_cacUWyO5Ld3_DWVaZZ7Y1Qz3vEh5vCiOfVV_mIGlwlLawJuyPsLo6hbsy-4QeQGjjspEIouVIogOTUoXVRWdckpyS5JfSe0Fv_HP75990blkhdqlYgkGTtqga5IMmXa4uPWDrTnBavkLRaWiei6oLo0UgBe3S1FFt8RO1artQzYQvClj3d_K57AACwCrEmbMH8cjJZ6Fj0-4YFMr-fypLawYFL_Tp3J7w_ktvBnvX4ZjQfuid7Jn1nGiBs4QVIIMk9UJLchcc1ZP6xg0UStoQzif6nZxjhoVa8xG3BywfCFleccm7yaN0gnrfOEJbDoOvtqOvrYqOfZnTIyPzkt_FhiI6pP9fmUEsfUk_SVT6u9p2ZMAtuuy_HYBwCDmaq7uTCzIS3Fyx_-CAmOVVKFCSnUJrDgWsBSmqE0mgrrUPt1DM0aFvlrI9vVyFIvcNGmsbHfYnWQoMeaqn3XQZYZ-oaBVjHHYJ3KvCdw2YqrOIWBDpeVijAS8WjdChOKXLuClt1LyLCNt4U8L4PAQqxx9yzhdms4K6svLmEsaIBiw5mRR-vMFsDYfOiQf5QGx8-QlpeKCRs3q_17lLSOsLmhDHoeZVGO6lb9K9mNRCWEhbDG3D9qLgDaQlbQ9N2XsMjlq3zAgc_-uDbN6bVwtP11oDF0mjhY6zVTqohrqDijwgFogZb8yfdu403CIUy5QMKz9a7KqRtTn2UsXUgcpWHwHlvgzMgnSftfHUwAoN0dMBh4pwQZ31I2IHR4Ifo3FaEXasUmNbVbTD7RaFTZj8UqkUIAbYco6dXbDbzIMV5ljAg2V2SEbbJ5_GCZH1e_N7TdyR9kA1ch_wDwpLYq6v5AUN58LhiD-g6bIMGuTU6rPqazxV8__b1-4_ffp9UmSbsZ4mv2kCPlFI63-Gc51le0HgOShZ9ekXWRN7G_tetz3JfhCDO5x3Dt2lHb818yQN6PJNDEn_OeFbJF69KeaiVD0B6pN6eUE6yRsixynrtz3jwgcec9jx-arykogiTn1BGu03ZYjxFXnAuR86s53wwj8rvZ1mzEJ1-GQr5yv7duD8brONK_TGhmtOU00vNttvBfX0Gb7l91mXJdYmqF3WKBvZPRkPGk-Vy50tGUXpsc5LT7VZzbbp09mGQZmMUXKM5h7-3fODb-SfNTu79I7g3gG7rPsf7CLh0smfCaTwwWU6Z-C38OG4-vrI57Tdn7CpAGV_QxfIKQN7WN9C5FLMcxMwvDQ269Vry4wtwk09wPy646Se4Hxfc7BPcjwtu_gnuBwP3y6l7ORjRKgwdgwvdEWGbyhyQsM3hyfyppX0gbGO5FoU5Erbx3_vbU2exDb3gtmv--naOMNa3FLdNWUmHpWubQYTX7bjIt3k6a_WDNk96pqRuj7O9bqMXXcWkhfkf27_A-e5EH3tFGChTcieNti9lj23i5QJcEduZq9RkzQ6LIvLxFk-XTrcoE7ZTjd_bIyW34KQIKRioPeJ_v895Jd_70Jt-jV_ITS_kZjzhS07Psnu4cPrLNWXi7jh6qURyqUT2C5RIL5XIf4ES2aUS81-gRH6pxOL_pMR5tjRo24PU-3dm0nv6y2uOeOuce83qF2db__6VYy2w6ar9cAUw6dR3liS39MhEOjbsV48mvuSLnstiehkBZ9cRb-wuhnY_fnFbgOOJg-PnxNne4ViOk-EOQ-GlgCJ-5Q5jPrnC-Hu949UIfvsb5RO7fxC797SGn9j9u7B7T-f3id2_C7v3NHaf2P167Eh2x0h2D-E73ba2Ri0wDJe6tjt0EcNQ7Y151m2Y3z1V0rds69BwSL0PU6yfpgiTwcMzkJz-aSuSU7AVKgW2Mk9XhkF_XbU3NevGY99gZxrsxmggHXRjyfAYRlgcvn_7uv7tPz-iF7PPBj1lW2LQP4wQYxrRKCDb_ZpFNEqH6VcYbgos2j0UrVQCzM6bHMbcOY1uxCoRy2TJb3AV5_MszmmaxTfVKi8xzctFXCwLzIt4kRZMsDIVaR4nJbL0Rq4YZQmNkzimjGZxlJfZLmOlWCQi4fMyISnFA5cqUurxEJlmfyOtbXGV05QubhQvUNnh7xaalSeaFe3ekpR6pOxpm5NO4SrYppA_Bsv7Ye4wteVumrmT6W3XsUu9v2kbtaqcqwO2bEPYZi9d1RZRaQ6h4X8c_pvVjfmJpSNsEzS2hG2C0v8NAAD__0nCUlo">