New Feature: Single Step Debugger Support
- Dominant language
- Python
- Stars
- 27
- Forks
- 29
- Avg merge
- 4d 6h
- Merged PRs (30d)
- 12
Description
### Problem description
Basic debug support through[ `debugpy` works well today with vsCode.](https://github.com/microsoft/debugpy)
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.
1) [Standard vsCode python extensions](https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy)
2) install `debugpy` on both the RIO and local desktop
3) 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
4) 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:
```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:
```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:
```py
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
```text
N/A
```
### Reproducible example code
```text
N/A
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.