Description
Problem description
Basic debug support through debugpy
works well today with vsCode.
Documenting this here for potential future integration.
Overall design goal: single-click debugger activation that lets you walk code line by line on a development computer, while execution is happening on the RIO.
- Standard vsCode python extensions
- install
debugpy
on both the RIO and local desktop - Add a vsCode task to start the robot in debug mode - for us, this involves dropping a blank file with a magic name in the RIO's filesystem, then restarting the robot code
- a small snippet of code in the robot main code to detect the "wait for debugger" file trigger and wait for a debug connection.
tasks.json:
{
"label": "PyFRC: _Activate Debug",
"type": "shell",
"windows": {
"command": "ssh lvuser@roboRIO-1736-FRC.local -t 'chmod +x ./robotCommand; touch /home/lvuser/py/enableDebug; ./robotCommand || true; echo Waiting for robot program to start...; sleep 5' "
},
"linux": {
"command": "ssh lvuser@roboRIO-1736-FRC.local -t 'chmod +x ./robotCommand; touch /home/lvuser/py/enableDebug; ./robotCommand || true; echo Waiting for robot program to start...; sleep 5' "
},
"group": {
"kind": "build",
},
"presentation": {
"reveal": "always",
"panel": "dedicated",
"clear": true,
"focus": true,
"showReuseMessage": false
},
"problemMatcher": [],
"icon": {
"id": "cloud-upload"
}
},
launch.json:
...
{
"name": "Debug RoboRIO",
"type": "python",
"request": "attach",
"connect": {
"host": "roboRIO-1736-frc.local",
"port": 5678
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "/home/lvuser/py"
}
],
"justMyCode": true,
"preLaunchTask": "PyFRC: _Activate Debug"
},
...
Robot Code:
if __name__ == '__main__':
enableDebug = os.path.isfile("/home/lvuser/py/enableDebug")
if(enableDebug):
print("Starting Debug Support....")
import debugpy
debugpy.listen(('0.0.0.0', 5678))
debugpy.wait_for_client()
wpilib.run(MyRobot)
The real trick is just to make sure the robot code gets restarted with the correct value for enableDebug
- it does slow down execution noticeably, and isn't something I think you'd want all the time.
I've got no idea if there's a better way than a file (environment variables?), but that just seemed to be the most reliable way.
One nice thingabout using a file: if the code is simply redeployed, the file is wiped away, so the code goes back to "normal/non-debug" mode.
Hopefully helps? Other than the funkiness of the file itself, I'd highly recommend the rest.
Operating System
Windows
Installed Python Packages
N/A
Reproducible example code
N/A
Metadata
Metadata
Assignees
Labels
Type
Projects
Status