microsoft / vscode-cpptools

Official repository for the Microsoft C/C++ extension for VS Code.
Other
5.45k stars 1.53k forks source link

"Unable to start debugging. Failed to find thread 1 for break event" when debugging Zephyr app #10195

Open joelspadin opened 1 year ago

joelspadin commented 1 year ago

Environment

The USB JLink debugger from the nRF5340 DK is passed through to WSL as described in https://learn.microsoft.com/en-us/windows/wsl/connect-usb

Bug Summary and Steps to Reproduce

Bug Summary: I am trying to debug a Zephyr application on an nRF5340 DK using its built-in JLink. When the application is built with CONFIG_DEBUG_THREAD_INFO=y, the debug session fails immediately with

ERROR: Unable to start debugging. Failed to find thread 1 for break event

When I debug from the command line, it works properly. It appears that thread 1 is only used for system initialization in Zephyr, and it exits shortly after the program starts, which may be the source of the error.

Steps to reproduce:

  1. Build a Zephyr application with -b nrf5340dk_nrf5340_cpuapp. (I am using https://zmk.dev/ which doesn't have support for the nRF5340 DK in mainline code yet, but I expect this could be reproduced with one of the Zephyr sample apps, like https://docs.zephyrproject.org/latest/samples/basic/blinky/README.html)
  2. Add to prj.conf
    CONFIG_DEBUG=y
    CONFIG_DEBUG_INFO=y
    CONFIG_DEBUG_THREAD_INFO=y
  3. Run west debugserver to start the GDB server.
  4. Start the vscode debugger.

Debugger Configurations

// Launch configuration
      {
        "name": "GDB,
        "type": "cppdbg",
        "request": "launch",
        "cwd": "${workspaceFolder:zmk}/app",
        "program": "${workspaceFolder:zmk}/app/build/zmk_uno/zephyr/zmk.elf",
        "miDebuggerPath": "/home/joel/.local/zephyr-sdk-0.15.1/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb",
        "miDebuggerServerAddress": "localhost:2331",
        "preLaunchTask": "gdbserver",
        "launchCompleteCommand": "exec-continue",
        "logging": {
          "trace": true,
          "traceResponse": true,
          "engineLogging": true
        }
      },

// Tasks
{
        "label": "gdbserver",
        "type": "shell",
        "options": {
          "cwd": "${workspaceFolder:zmk}/app"
        },
        "command": "west debugserver -d build/zmk_uno",
        "isBackground": true,
        "problemMatcher": {
          "owner": "jlink",
          "fileLocation": "autoDetect",
          "pattern":[
            {
              "regexp": "$^",
              "file": 1,
              "location": 2,
              "message": 3
            }
          ],
          "background": {
            "activeOnStart": true,
            "beginsPattern": "west debugserver: rebuilding",
            "endsPattern": "J-Link GDB server running"
          }
        }
      }

Debugger Logs

See error.log in additional information.

Other Extensions

No response

Additional Information

The debug console log is too large to paste directly, so I've attached it here: error.log

When debugging from the command line, where GDB works properly, I get the following output: debug.log

WardenGnaw commented 1 year ago

There seems to be some issue with the current state of threads from GDB.

In the response from GDB, it is not returning a thread with id 1, but claiming the current thread is 1. If thread 1 has disappeared, it should return saying current-thread-id is 2.

1: (315) ->1024^done,threads=[{id="2" ... current-thread-id="1"

1: (313) <-1024-thread-info
<--   C (threads-9): {"command":"threads","type":"request","seq":9}
--> E (output): {"type":"event","event":"output","body":{"category":"console","output":"1: (315) ->1024^done,threads=[{id=\"2\",target-id=\"Thread 536891112\",details=\"main SUSPENDED PRIO 0\",frame={level=\"0\",addr=\"0x0000a270\",func=\"arch_swap\",args=[{name=\"key\",value=\"0\"},{name=\"key@entry\",value=\"0\"}],file=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",fullname=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",line=\"53\",arch=\"armv8-m.main\"},state=\"stopped\"},{id=\"3\",target-id=\"Thread 536890928\",details=\"idle 00 UNKNOWN PRIO 15\",frame={level=\"0\",addr=\"0x00009f7e\",func=\"arch_cpu_idle\",args=[],file=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/cpu_idle.S\",fullname=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/cpu_idle.S\",line=\"105\",arch=\"armv8-m.main\"},state=\"stopped\"},{id=\"4\",target-id=\"Thread 536874792\",details=\"logging PENDING PRIO 14\",frame={level=\"0\",addr=\"0x0000a270\",func=\"arch_swap\",args=[{name=\"key\",value=\"0\"},{name=\"key@entry\",value=\"0\"}],file=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",fullname=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",line=\"53\",arch=\"armv8-m.main\"},state=\"stopped\"},{id=\"5\",target-id=\"Thread 536883488\",details=\"usbworkq PENDING PRIO 255\",frame={level=\"0\",addr=\"0x0000a270\",func=\"arch_swap\",args=[{name=\"key\",value=\"0\"},{name=\"key@entry\",value=\"0\"}],file=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",fullname=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",line=\"53\",arch=\"armv8-m.main\"},state=\"stopped\"},{id=\"6\",target-id=\"Thread 536891296\",details=\"sysworkq PENDING PRIO 255\",frame={level=\"0\",addr=\"0x0000a270\",func=\"arch_swap\",args=[{name=\"key\",value=\"0\"},{name=\"key@entry\",value=\"0\"}],file=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",fullname=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",line=\"53\",arch=\"armv8-m.main\"},state=\"stopped\"},{id=\"7\",target-id=\"Thread 536883224\",details=\"ipm_work_q PENDING PRIO 240\",frame={level=\"0\",addr=\"0x0000a270\",func=\"arch_swap\",args=[{name=\"key\",value=\"0\"},{name=\"key@entry\",value=\"0\"}],file=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",fullname=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",line=\"53\",arch=\"armv8-m.main\"},state=\"stopped\"},{id=\"8\",target-id=\"Thread 536889384\",details=\" PENDING PRIO 255\",frame={level=\"0\",addr=\"0x0000a270\",func=\"arch_swap\",args=[{name=\"key\",value=\"0\"},{name=\"key@entry\",value=\"0\"}],file=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",fullname=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",line=\"53\",arch=\"armv8-m.main\"},state=\"stopped\"},{id=\"9\",target-id=\"Thread 536890744\",details=\" PENDING PRIO 250\",frame={level=\"0\",addr=\"0x0000a270\",func=\"arch_swap\",args=[{name=\"key\",value=\"0\"},{name=\"key@entry\",value=\"0\"}],file=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",fullname=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",line=\"53\",arch=\"armv8-m.main\"},state=\"stopped\"},{id=\"10\",target-id=\"Thread 536883704\",details=\"BT TX PENDING PRIO 247\",frame={level=\"0\",addr=\"0x0000a270\",func=\"arch_swap\",args=[{name=\"key\",value=\"0\"},{name=\"key@entry\",value=\"0\"}],file=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",fullname=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",line=\"53\",arch=\"armv8-m.main\"},state=\"stopped\"},{id=\"11\",target-id=\"Thread 536883888\",details=\"BT RX PENDING PRIO 248\",frame={level=\"0\",addr=\"0x0000a270\",func=\"arch_swap\",args=[{name=\"key\",value=\"0\"},{name=\"key@entry\",value=\"0\"}],file=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",fullname=\"/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c\",line=\"53\",arch=\"armv8-m.main\"},state=\"stopped\"}],current-thread-id=\"1\"\n"},"seq":375}
1: (315) ->1024^done,threads=[{id="2",target-id="Thread 536891112",details="main SUSPENDED PRIO 0",frame={level="0",addr="0x0000a270",func="arch_swap",args=[{name="key",value="0"},{name="key@entry",value="0"}],file="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",fullname="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",line="53",arch="armv8-m.main"},state="stopped"},{id="3",target-id="Thread 536890928",details="idle 00 UNKNOWN PRIO 15",frame={level="0",addr="0x00009f7e",func="arch_cpu_idle",args=[],file="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/cpu_idle.S",fullname="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/cpu_idle.S",line="105",arch="armv8-m.main"},state="stopped"},{id="4",target-id="Thread 536874792",details="logging PENDING PRIO 14",frame={level="0",addr="0x0000a270",func="arch_swap",args=[{name="key",value="0"},{name="key@entry",value="0"}],file="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",fullname="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",line="53",arch="armv8-m.main"},state="stopped"},{id="5",target-id="Thread 536883488",details="usbworkq PENDING PRIO 255",frame={level="0",addr="0x0000a270",func="arch_swap",args=[{name="key",value="0"},{name="key@entry",value="0"}],file="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",fullname="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",line="53",arch="armv8-m.main"},state="stopped"},{id="6",target-id="Thread 536891296",details="sysworkq PENDING PRIO 255",frame={level="0",addr="0x0000a270",func="arch_swap",args=[{name="key",value="0"},{name="key@entry",value="0"}],file="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",fullname="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",line="53",arch="armv8-m.main"},state="stopped"},{id="7",target-id="Thread 536883224",details="ipm_work_q PENDING PRIO 240",frame={level="0",addr="0x0000a270",func="arch_swap",args=[{name="key",value="0"},{name="key@entry",value="0"}],file="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",fullname="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",line="53",arch="armv8-m.main"},state="stopped"},{id="8",target-id="Thread 536889384",details=" PENDING PRIO 255",frame={level="0",addr="0x0000a270",func="arch_swap",args=[{name="key",value="0"},{name="key@entry",value="0"}],file="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",fullname="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",line="53",arch="armv8-m.main"},state="stopped"},{id="9",target-id="Thread 536890744",details=" PENDING PRIO 250",frame={level="0",addr="0x0000a270",func="arch_swap",args=[{name="key",value="0"},{name="key@entry",value="0"}],file="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",fullname="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",line="53",arch="armv8-m.main"},state="stopped"},{id="10",target-id="Thread 536883704",details="BT TX PENDING PRIO 247",frame={level="0",addr="0x0000a270",func="arch_swap",args=[{name="key",value="0"},{name="key@entry",value="0"}],file="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",fullname="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",line="53",arch="armv8-m.main"},state="stopped"},{id="11",target-id="Thread 536883888",details="BT RX PENDING PRIO 248",frame={level="0",addr="0x0000a270",func="arch_swap",args=[{name="key",value="0"},{name="key@entry",value="0"}],file="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",fullname="/home/joel/projects/zmk/zephyr/arch/arm/core/aarch32/swap.c",line="53",arch="armv8-m.main"},state="stopped"}],current-thread-id="1"
joelspadin commented 1 year ago

I noticed when debugging from the command line that there is initially a thread 1, but that it very quickly exits. I'm guessing that Zephyr starts a thread to initialize the system and then the thread exits when it's done.

mertzt89 commented 1 year ago

I think this may actually be a bug in the rtos plugin for JLink. This seems related to #10848.