Skip to content

Instantly share code, notes, and snippets.

@floooh
Last active May 3, 2024 02:00
Show Gist options
  • Star 19 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save floooh/31143278a0c0bae4f38b8722a8a98463 to your computer and use it in GitHub Desktop.
Save floooh/31143278a0c0bae4f38b8722a8a98463 to your computer and use it in GitHub Desktop.
How to debug Zig tests in VSCode

Tested on macOS:

  1. Install the CodeLLDB VSCode extension. Unlike the debugger in the C/C++ extension, this allows to set breakpoints inside Zig "test" blocks (in the MS C/C++ extension debugger, breakpoints inside test blocks will be disabled once the debugger starts for unknown reasons.
  2. When compiling the test, tell it to also emit a binary: zig test -femit-bin=zig-out/bin/my-test src/bla.zig, otherwise there will be no executable to debug.
  3. The compiled test executable expects the path to the Zig executable as first command line argument, the launch.json file needs to be setup accordingly (note the args item):
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "program": "${workspaceFolder}/zig-out/bin/my-test",
            "args": ["/usr/local/bin/zig"],
            "cwd": "${workspaceFolder}",
            
        }
    ]
}

That should be all, now set breakpoints inside tests and start the debugger with F5.

@akhildevelops
Copy link

Works without args in launch.json

@santiagocabrera96
Copy link

Thanks, I was needing this. I included some additional things to run only the tests of a file in case anybody need this later.

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug test",
            "program": "${workspaceFolder}/zig-out/bin/${fileBasenameNoExtension}test",
            "args": [],
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "build zig test"
        }
    ]
}

tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build zig test",
            "type": "shell",
            "command": "zig test -femit-bin=zig-out/bin/${fileBasenameNoExtension}test ${relativeFile}"
        }
    ]
}

@geek0x23
Copy link

geek0x23 commented Apr 30, 2024

I found that the above solution runs tests twice. I was able to fix this with some slight modifications:

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug test",
            "program": "${workspaceFolder}/zig-out/bin/${fileBasenameNoExtension}-test",
            "args": [],
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "test",
        }
    ]
}

tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "test",
            "type": "shell",
            "command": "zig",
            "args": [
                "test",
                "-femit-bin=zig-out/bin/${fileBasenameNoExtension}-test",
                "--test-no-exec",
                "${relativeFile}",
            ]
        }
    ]
}

Notice the additional argument --test-no-exec. This will cause the test runner to emit the binary test file without actually running the tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment