---
title: "Vscode-R-Debugger"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Vscode-R-Debugger}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

The extension [vscode-R-debugger](https://marketplace.visualstudio.com/items?itemName=RDebugger.r-debugger) adds debugging capabilities for the
[R](https://www.r-project.org/)
programming language to Visual Studio Code
and depends on the R package [vscDebugger](https://github.com/ManuelHentschel/vscDebugger).
For further R support in VS Code see e.g. [vscode-R](https://github.com/Ikuyadeu/vscode-R) and [R LSP](https://github.com/REditorSupport/vscode-r-lsp).

## Features

![features.png](images/features.png)

The debugger includes the following features:

1. Run and debug R Code by launching a new R process or attaching to a running one.
2. View scopes and variables of the currently selected stack frame.
For many variables it is also possible to assign a new value to the variable or individual entries/attributes in this view.
3. Add watch expressions that are evaluated in the selected stack frame on each breakpoint/step.
4. View and browse through the call stack when execution is paused.
5. Set breakpoints and break on errors.
6. Control the program flow using *step*, *step in*, *step out*, *continue*.
7. Output generated by the program is printed to the debug console (filtering out text printed by the browser itself).
8. The debugger adds a modified version of `print`, `cat`, `message`, and `str` that also print a link to the file and line where the text was printed.
9. The debug console allows the execution of arbitrary R code in the currently selected stack frame.


## Installation
The latest version of the VS Code extension can be installed from the
[marketplace](https://marketplace.visualstudio.com/items?itemName=RDebugger.r-debugger).
After installing the extension, the R package can be installed using the command 
`r.debugger.updateRPackage`.
If this does not work, you can find the source code and compiled binaries on the
[releases site](https://github.com/ManuelHentschel/VSCode-R-Debugger/releases).

The provided packages were built using the latest R release and might be incompatible with older R versions.
In these cases it is necessary to build the package from code.

If you want to install a development version, the VS Code extension can be installed from the .vsix-files found 
[here](https://github.com/ManuelHentschel/VSCode-R-Debugger/actions?query=workflow%3Amain).
To download the correct file, filter the commits by branch, select the latest commit,
and download the file `r-debugger.vsix` under the caption "Artifacts".
To install the latest development version of the required R-package from GitHub, run
`devtools::install_github("ManuelHentschel/vscDebugger")`
or install from the artifacts found 
[here](https://github.com/ManuelHentschel/vscDebugger/actions).

If your R path is neither in the Windows registry nor the `PATH` environment variable, make sure to provide a valid path to the R executable in `r.rpath.xxx`.

## Using the Debugger
### Launch Mode
* Press F5 and select `R Debugger` as debugger. With the default launch configuration, the debugger will start a new R session.
* To run a file, focus the file in the editor and press F5 (or the continue button in the debug controls)
* Output will be printed to the debug console,
expressions entered into the debug console are evaluated in the currently active frame
* During debugging in the global workspace it is often necessary to click the dummy frame
in the callstack labelled 'Global Workspace' to see the variables in `.GlobalEnv`.

### Attach Mode
* Start R in a terminal
* Load `library(vscDebugger)`
* Call `.vsc.listen()`
* Start the debugger with launch configuration including `"request":"attach"`, e.g.:
``` json
{
    "type": "R-Debugger",
    "request": "attach",
    "name": "Attach to R process"
}
```

## Configuration
For a detailed explanation of possible launch config entries and other settings, see
[Configuration](https://manuelhentschel.github.io/vscDebugger/articles/configuration.html).

## How it works
The debugger works as follows:

* An R process is started inside a child process
* The R package `vscDebugger` is loaded.
* The Debugger starts and controls R programs by sending input to stdin of the child process
* After each step, function call etc., the debugger calls functions from the package `vscDebugger` to get info about the stack/variables

The output of the R process is read and parsed as follows:

* Information sent by functions from `vscDebugger` is encoded as json and sent via a TCP socket.
These lines are parsed by the VS Code extension and not shown to the user.
* Information printed by the `browser()` function is parsed and used to update the source file/line highlighted inside VS Code.
These lines are also hidden from the user.
* Everything else is printed to the debug console


## Debugging R Packages
Packages can now be debugged using `load_all` from `pkgload`.
To do so, it is required to install `pkgload` (part of `devtools`).
By default, `load_all` will be masked by a modified version that automatically sets breakpoints
in the loaded package and attaches the modified versions of `print`, `cat`, `message`.
To always load a package when launching a debug session, you can specify an array of paths in the launch config entry `"loadPackages"`.
This is done (for the currently opened package) in the example debug config `"Debug R-Package"`.


Packages with a more complicated installation that might not be compatible with `load_all` can also be debugged.
For this to work, the proper source information must be retained during the installation of the package
(check `attr(attr(FUNCTION_NAME, 'srcref'), 'srcfile')` for some function from the package):

* The package must be installed from source code (not CRAN or `.tar.gz`)
* The flag `--with-keep.source` should be set
* Extensions containing C code might cause problems.
Sometimes it helps to install the package using
`devtools::install(quick=FALSE, ...)`
to compile the binaries and again with
`devtools::install(quick=TRUE, ...)`
to retain the source information.

The packages that are being debugged then need to be specified in the launch config as follows:
```json
"debuggedPackages": ["MyPackage"],
...
```

To overwrite the `print`/`cat`/`message` functions for an individual package,
they need to be explicitly assigned somewhere in the package:
``` r
print <- print
cat <- cat
message <- message
```
This assignment can be overwritten by the debugger with
`.vsc.print`/`.vsc.cat`/`.vsc.message`, but has no effect when not using the debugger.

## Troubleshooting
For troubleshooting info, see [Troubleshooting](https://manuelhentschel.github.io/vscDebugger/articles/troubleshooting.html)

## Contributing
This package is still under development.
If you have problems, suggestions, bug fixes etc. feel free to open an
[issue](https://github.com/ManuelHentschel/VSCode-R-Debugger/issues)
or submit a pull request.
Any feedback or support is appreciated!
Special thanks to
[@tdeenes](https://github.com/tdeenes)
for providing the C code used in the R package, and
[@renkun-ken](https://github.com/renkun-ken)
for his numerous contributions and feedback!
