The closest to my issue is this SO question, but I think something else is going on here. I have two launch configurations each which call a similar preLaunch task, start-local and start-dev. The body of these two tasks is almost identical, except that VS Code can only find whichever of these is declared last in the task.json file. I tested this by duplicating the first task and simply changing the label, and none but the last task can ever be found. Is this a bug or am I doing something wrong? Pasting my configs for reference:
VS Code Version: 1.72.2
OS Version: MacOS 12.6
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Start Dev",
"type": "chrome",
"request": "launch",
"url": "http://localhost:3000",
"webRoot": "${workspaceFolder}",
"preLaunchTask": "start-dev",
"postDebugTask": "Terminate All Tasks"
},
{
"name": "Start Local",
"type": "chrome",
"request": "launch",
"url": "http://localhost:3001",
"webRoot": "${workspaceFolder}",
"preLaunchTask": "start-local",
"postDebugTask": "Terminate All Tasks"
},
]
}
task.json
{
"version": "2.0.0",
"tasks": [
{
"label": "start-local",
"type": "npm",
"script": "start",
"isBackground": true,
"problemMatcher": {
"owner": "npm",
"background": {
"activeOnStart": true,
"beginsPattern": ".*",
"endsPattern": "To ignore, add.*eslint-disable-next-line to the line before.*"
},
"pattern": {
"regexp": ""
}
},
"dependsOrder": "sequence",
"dependsOn": [
"setup-local-env"
]
},
{
"label": "setup-local-env",
"command": "echo REACT_APP_STAGE=local > ./.env; echo BROWSER=none >> ./.env",
"type": "shell",
"presentation": {
"echo": false,
"reveal": "never",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": false,
"close": true
}
},
{
"label": "start-dev",
"type": "npm",
"script": "start",
"isBackground": true,
"problemMatcher": {
"owner": "npm",
"background": {
"activeOnStart": true,
"beginsPattern": ".*",
"endsPattern": "To ignore, add.*eslint-disable-next-line to the line before.*"
},
"pattern": {
"regexp": ""
}
},
"dependsOrder": "sequence",
"dependsOn": [
"setup-dev-env"
]
},
{
"label": "setup-dev-env",
"command": "echo REACT_APP_STAGE=dev > ./.env; echo BROWSER=none >> ./.env",
"type": "shell",
"presentation": {
"echo": false,
"reveal": "never",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": false,
"close": true
}
},
{
"label": "Terminate All Tasks",
"command": "echo ${input:terminate}",
"type": "shell",
"problemMatcher": []
},
],
"inputs": [
{
"id": "terminate",
"type": "command",
"command": "workbench.action.tasks.terminate",
"args": "terminateAll"
}
]
}
Related
i'm developing embedded firmware on zephyr RTOS. Zephyr env. works on WSL2. And "Vscode remote client" works in Win10 "Vscode Server" works on Ununtu 22.04.
I use Jlink debbugger for flashing and debugging firmware. I have to use remote debugging because debugger connected to Win10 via USB. So I run the JLink "JLinkRemoteServerCL.exe" in Win10 before flash or debug.
But every time I plug or unplug the USB into the PC JLink Remote Connection disconnects. This is annoying.
My goal is to automatically run "JLinkRemoteServerCL.exe" when I run the flash task and close it after the flash task is complete.
I wrote two task for it and connect the flash task to start "JLinkRemoteServerCL.exe" task with "dependsOn" property. But Flash task doesn't start because when start to "JLinkRemoteServerCL.exe" task, it waits connection and never finish.
I do not know how to kill the "Start Remote Server" task even if i achieve run the "Flash" task.
How can I flash my MCU's with run only 1 task?
{
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"command": "west",
"type": "shell",
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
},
"args": [
"build",
"--pristine",
"-b",
"${input:board}",
"-d",
"builds/build_${input:board}",
"--",
"-DBOARD_ROOT=../Common",
"-DCONF_FILE=prj.conf",
"-DOVERLAY_CONFIG=configs/prj_${input:board}.conf",
"-DDTC_OVERLAY_FILE=boards/${input:board}.overlay"
],
"problemMatcher": [
"$gcc"
],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
}
},
{
"label": "Build MCUBOOT",
"command": "west",
"type": "shell",
"options": {
"cwd": "${workspaceFolder}"
},
"args": [
"build",
"$ZEPHYR_BASE/../bootloader/mcuboot/boot/zephyr",
"--pristine",
"-b",
"${input:board}",
"-d",
"builds/build_${input:board}/bootloader/mcuboot",
"--",
"-DBOARD_ROOT=${cwd}/../Common",
"-DOVERLAY_CONFIG=${cwd}/bootloader_configs/prj_mcuboot_${input:board}.conf",
"-DDTC_OVERLAY_FILE=${cwd}/boards/${input:board}.overlay",
"-DCONFIG_BOOT_SIGNATURE_KEY_FILE=\\\"${cwd}/../Common/keys/${input:key}\\\""
],
"problemMatcher": [
"$gcc"
],
"presentation": {
"reveal": "always"
},
},
{
"label": "Flash",
"command": "west",
"type": "shell",
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
},
"args": [
"flash",
"-d",
"builds/build_${input:board}",
"--hex-file",
"builds/build_${input:board}/zephyr/zephyr.bin",
"-r",
"jlink",
"--tool-opt=ip 192.168.0.21"
],
"dependsOn" : "Start JLink Remote Server"
},
{
"label": "Flash with MCUBOOT",
"command": "west",
"type": "shell",
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
},
"args": [
"flash",
"-d",
"builds/build_${input:board}",
"--hex-file",
"builds/build_${input:board}/merged.hex",
"-r",
"jlink",
"--tool-opt=ip 192.168.0.21"
],
"dependsOn" : "Start JLink Remote Server"
},
{
"label": "Sign",
"command": "west",
"type": "shell",
"options": {
"cwd": "${workspaceFolder}"
},
"args": [
"sign",
"-t",
"imgtool",
"-d",
"builds/build_${input:board}",
"--",
"--version",
"${input:version_num}",
"--key",
"${workspaceFolder}/../Common/keys/${input:key}"
]
},
{
"label": "Build With MCUBOOT",
"command": "python3",
"type": "shell",
"group": "build",
"args": [
"$ZEPHYR_BASE/scripts/build/mergehex.py",
"builds/build_${input:board}/zephyr/zephyr.signed.hex",
"builds/build_${input:board}/bootloader/mcuboot/zephyr/zephyr.hex",
"-o",
"builds/build_${input:board}/merged.hex"
],
"dependsOn":["Get Inputs", "Build", "Build MCUBOOT", "Sign"],
"dependsOrder": "sequence"
},
{
"label": "Start JLink Remote Server",
"type": "shell",
"command": "/mnt/c/Program\\ Files/SEGGER/JLink/JLinkRemoteServerCL.exe",
},
{
"label": "Get Inputs",
"type": "shell",
"command": "echo",
"args": [
"Board:",
"\b${input:board}",
"Key:",
"\b${input:key}",
"Version:",
"\b${input:version_num}"
],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": true
}
}
],
"inputs": [
{
"id": "board",
"description": "Zephyr Target Board",
"default": "witag_litum",
"type": "pickString",
"options":[
"witag_litum",
"nucleo_l073rz",
"witag_bdcip",
"witag",
"tsg001",
"ft06dch",
"eagleeyesense",
"lowcost",
"nrf52833dk_nrf52833",
"nrf52840dongle_nrf52840",
]
},
{
"id": "version_num",
"description": "Version Number:",
"default": "100.100.1+0",
"type": "promptString"
},
{
"id": "key",
"description": "MCUBOOT KEY file located in Common/keys",
"default": "witag_litum",
"type": "pickString",
"options":[
"WiTag.pem",
"WiTag_Litum.pem",
"root-rsa-2048.pem"
]
}
]
}
I currently have a tasks.json that runs 3 tasks together, grouped in a panel on folder startup:
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "Run dev",
"type": "shell",
"command": "npm run dev",
"presentation": {
"reveal": "always",
"panel": "new",
"group": "develop",
},
"runOptions": { "runOn": "folderOpen" }
},
{
"label": "Run css",
"type": "shell",
"command": "npm run watch:css",
"presentation": {
"reveal": "always",
"panel": "new",
"group": "develop",
},
"runOptions": { "runOn": "folderOpen" }
},
{
"label": "Run tunnel",
"type": "shell",
"command": "npm run tunnel",
"presentation": {
"reveal": "always",
"panel": "new",
"group": "develop",
},
"runOptions": { "runOn": "folderOpen" }
},
{
"label": "Start Dev",
"dependsOn": [
"Run dev",
"Run css",
"Run tunnel"
],
"problemMatcher": []
}
]
}
What i'm looking to do is move Run dev to a launch configuration instead so I have debugging enabled by default, and keep the same terminal experience:
launch.json
{
"configurations": [
{
"name": "Run npm run dev",
"command": "npm run dev",
"request": "launch",
"type": "node-terminal",
"cwd": "${workspaceFolder}",
"console": "internalConsole",
"serverReadyAction": {
"pattern": "started at http://localhost:([0-9]+)",
"uriFormat": "http://localhost:%s",
"action": "openExternally"
}
}
]
}
So the end result will be the same 3 tasks, but "Run dev" triggers the "Run npm run dev" launch configuration in it's terminal window
The problem is there doesn't seem to be a way to do this?
I am setting up VSCode for Embedded development with Nordic NRF52.
I have noticed that in the nrf_sdk there are examples for several boards and several soft devices.
I have seen that it is possible to reference env variables that have been previously defined both in tasks, launch and extension properties, such as: c_cpp, stm32-for-vscode. But what about having a section in the workspace file defined as my_vars so the workspace file looks like this?
{
"my_vars": {
"BOARD_NAME": "NRF52840_MDK_USB_DONGLE",
"MCU_NAME": "NRF52840",
"SOFT_DEVICE": "S140",
"BOARD_VARIANT_PATH": "/pca10059/mbr"
},
"launch": {
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug",
"cwd": "${workspaceRoot}",
"executable": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc/_build/${my_vars:MCU_NAME}_xxaa.out",
"request": "launch",
"type": "cortex-debug",
"servertype": "jlink",
"device": "nrf52",
"interface": "swd",
"ipAddress": null,
"serialNumber": null,
"armToolchainPath": "${env:VSARM}/armcc/bin/"
},
]
},
"folders": [
{
"path": "."
}
],
"settings":{
// "C_Cpp.name": "nRF52840 DK",
"C_Cpp.default.includePath": [
"${workspaceFolder}/**",
"${env:GNU_GCC}/arm-none-eabi/include",
"${env:NRF_SDK}/modules/**",
"${env:NRF_SDK}/components/**"
],
"C_Cpp.default.defines": [
"${my_vars:BOARD_NAME}",
"CONFIG_GPIO_AS_PINRESET",
"INITIALIZE_USER_SECTIONS",
"FLOAT_ABI_HARD",
"NRF52",
"${my_vars:MCU_NAME}_XXAA",
"NRF_SD_BLE_API_VERSION=6",
"${my_vars:SOFT_DEVICE}",
"SOFTDEVICE_PRESENT",
"SWI_DISABLE0"
],
"C_Cpp.default.compilerPath": "${env:GNU_GCC}/bin/arm-none-eabi-gcc",
"C_Cpp.default.cStandard": "c11",
"C_Cpp.default.cppStandard": "c++17",
"C_Cpp.default.intelliSenseMode": "clang-x64"
},
"tasks": {
"version": "2.0.0",
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"tasks": [
{
"label": "nRF52 build",
"type": "shell",
"command": "make",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "nRF52 build clean",
"type": "shell",
"command": "make clean",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "nRF52 flash",
"type": "shell",
"command": "make flash",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
},
{
"label": "nRF52 dfu upload",
"type": "shell",
"command": "make bootload",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
},
{
"label": "nRF52 flash_softdevice",
"type": "shell",
"command": "make flash_softdevice",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
},
},
{
"label": "nRF52 sdk_config",
"type": "shell",
"command": "make sdk_config",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"problemMatcher": []
},
{
"label": "nRF52 erase",
"type": "shell",
"command": "make erase",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
},
}
]
}
}
I tried having a task which is set_env, which in my case, since I am in Windows, run a batch script that does:
set BOARD_NAME=NRF52840_MDK_USB_DONGLE
set MCU_NAME=NRF52840
set SOFT_DEVICE=S140
set BOARD_VARIANT_PATH=/pca10059/mbr
This will ease a lot playing around with the SDK examples and could be potential work for a NRF52 VSCode extension, as https://marketplace.visualstudio.com/items?itemName=bmd.stm32-for-vscode does.
You've undoubtedly solved this problem by now, but hopefully I can save someone else some searching.
There is a top-level section called env that holds global variables that you can reference in your configs.
Here's an example from MSDN.
{
"env": {
"myDefaultIncludePath": ["${workspaceFolder}", "${workspaceFolder}/include"],
"myCompilerPath": "/usr/local/bin/gcc-7"
},
"configurations": [
{
"name": "Mac",
"intelliSenseMode": "clang-x64",
"includePath": ["${myDefaultIncludePath}", "/another/path"],
"macFrameworkPath": ["/System/Library/Frameworks"],
"defines": ["FOO", "BAR=100"],
"forcedInclude": ["${workspaceFolder}/include/config.h"],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"compileCommands": "/path/to/compile_commands.json",
"browse": {
"path": ["${workspaceFolder}"],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
],
"version": 4
}
Have a look at the extension Command Variable.
It can use the content of a file as key-value pairs.
I have multiple cpp files in my workspace folder. I want to write my Tasks.json file to pick up all the cpp files in the folder to build them so that linker can link them.
I want to write a generic task.json configuration for this so that I can have multiple folder sin my workspace folder.
Is it possible?
My current Task.json file
"version": "2.0.0",
"tasks": [
// MAC OS Build
{
"type": "shell",
"label": "MAC g++ build active file",
"presentation": {
"echo": true,
"reveal": "always",
"focus": true,
"panel": "shared",
"showReuseMessage": true,
"clear": true
},
"command": "/usr/bin/g++",
"args": [
"-Wall",
"-Wno-c++11-extensions",
"-std=c++14",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "/usr/bin"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": {
"owner": "cpp",
"fileLocation": ["relative", "${workspaceFolder}"],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
}
},
When I try to set a breakpoint nothing happens; I put my cursor on the println! line and press F9.
fn main() {
println!("Hello, world!");
}
I works on another machine where Visual Studio 2017 is installed, so I suspect this might the problem.
tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "cargo build",
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"panel": "dedicated",
"clear": true
},
"problemMatcher": {
"owner": "rust",
"fileLocation": [
"relative",
"${workspaceRoot}"
],
"pattern": {
"regexp": "^(.+):(\\d+):(\\d+):\\s+(\\d+):(\\d+)\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"endLine": 4,
"endColumn": 5,
"severity": 6,
"message": 7
}
}
},
{
"label": "clean",
"type": "shell",
"command": "cargo clean"
},
{
"label": "run",
"type": "shell",
"command": "cargo run",
"presentation": {
"panel": "dedicated",
"clear": true
},
"problemMatcher": []
},
{
"label": "test",
"type": "shell",
"command": "cargo test",
"group": {
"kind": "test",
"isDefault": true
},
"presentation": {
"panel": "dedicated",
"clear": true
},
"problemMatcher": [
{
"owner": "rust",
"fileLocation": [
"relative",
"${workspaceRoot}"
],
"pattern": {
"regexp": "^(.+):(\\d+):(\\d+):\\s+(\\d+):(\\d+)\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"endLine": 4,
"endColumn": 5,
"severity": 6,
"message": 7
}
},
{
"owner": "rust",
"fileLocation": [
"relative",
"${workspaceRoot}"
],
"severity": "error",
"pattern": {
"regexp": "^.*panicked\\s+at\\s+'(.*)',\\s+(.*):(\\d+)$",
"message": 1,
"file": 2,
"line": 3
}
}
]
}
]
}
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "(Windows) Launch",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/target/debug/${workspaceRootFolderName}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/target/debug/",
"environment": [],
"externalConsole": true,
},
]
}
I have Visual Studio 2019 installed:
>cl --version
Microsoft (R) C/C++ Optimizing Compiler Version 19.20.27508.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
I have these Visual Studio Code extensions installed:
C/C++ 0.22.1
Rust (rls) 0.6.0
I am using Rust 1.33.0.
try setting the setting value "debug.allowBreakpointsEverywhere" to true