| # Debugging and Troubleshooting | |
| Some tips and advice for debugging issues with the RLS. Many of these issues are | |
| specific to the Visual Studio Code extension. | |
| Where we mention settings, below, we usually mean Visual Studio Code's settings. | |
| These can be set per-user and per-project, and can be found in the `File > | |
| Preferences > Settings` menu. | |
| ## Common problems | |
| ### Missing Rustup | |
| The only external component that the VSCode extension requires is Rustup. It | |
| will install everything else (RLS, even Rust) itself. | |
| You can install Rustup from [rustup.rs](https://www.rustup.rs/). The extension | |
| should warn you if it is not present. See the extension section below for more | |
| issues. | |
| ### Missing RLS component | |
| ### stable, beta toolchains | |
| You might see an error like `toolchain 'stable-x86_64-unknown-linux-gnu' does not contain component 'rls' for target 'x86_64-unknown-linux-gnu'`, | |
| however we guarantee for stable and beta toolchains to contain the `rls` component. | |
| This might be [rustup.rs issue](https://github.com/rust-lang/rustup.rs/issues/1626). | |
| Plese submit additional information to above issue if you'd like. | |
| If you face this case, you may have to reinstall the toolchain. | |
| ``` | |
| $ rustup uninstall stable | |
| $ rustup install stable | |
| $ rustup component add rls | |
| ``` | |
| ### nightly toolchain | |
| You might see an error like `toolchain 'nightly-x86_64-unknown-linux-gnu' does not contain component 'rls' for target 'x86_64-unknown-linux-gnu'`. | |
| This is due to a nightly release missing the RLS component. That | |
| happens occasionally when the RLS cannot be built with the current compiler. To | |
| work around this issue you can use an RLS from the beta or stable channels, wait | |
| for a new nightly which does contain the RLS component, or use an older nightly | |
| which includes the RLS component. To do the latter follow [these | |
| instructions](https://github.com/rust-lang/rls-vscode/issues/181#issue-269383659), | |
| then avoid `rustup update`. | |
| ### Out of date components | |
| Run `rustup update` from the command line to make sure Rust, the RLS, and | |
| associated data are all up to date. | |
| ### Project has both a library and a binary | |
| The RLS can currently only work with one target at a time. By default, the RLS | |
| works with the binary, if there is only one. You can build the library by | |
| setting `rust.build_lib` to `true` (this is often most useful). If you have | |
| multiple binaries, you can specify one to work with using `rust.build_bin`. | |
| Auto-detection for some of this should be in the next release. | |
| ### Opening a Rust file outside of a project | |
| Before opening a Rust file, the RLS needs to be aware of the whole crate. That | |
| means you need to have opened the folder containing `Cargo.toml` in VSCode | |
| before opening a Rust file (which triggers loading the Rust extension). | |
| ### Information for paths | |
| If you have a path such as `foo::bar::baz`, the RLS only has information for the | |
| last segment of the path. That means you can only 'goto def' or get type | |
| information on hover for `baz`, not for `foo` or `bar`. This is a limitation in | |
| the Rust compiler, but should be addressed at some point. | |
| ### Tests, examples | |
| The RLS currently only works with the main part of a crate. It does not work | |
| with the tests or examples folders. | |
| The RLS can give information about unit tests, you need to set `rust.cfg_test` | |
| to `true` (note that this will cause a lot of 'unused code' warnings, which is | |
| why it is off by default). | |
| ### Stale data | |
| Stale data can often trip up or slow down the RLS. It can be worth running `cargo | |
| clean` and/or deleting the entire `target` directory for your crate. You'll need | |
| to restart the extension after doing this to get a proper rebuild. | |
| It is also possible (but rarer) that Rustup gets into a bad place with stale | |
| data. You can reinstall rustup and/or delete its cache (in `~/.rustup`) to try | |
| and solve this. | |
| ### Deprecated environment variables | |
| If you were using early versions of the RLS and extension, you might have used | |
| `RLS_PATH` or `RLS_ROOT` env vars. These can cause issues now, so remove them | |
| from your environment (this won't be necessary with the next release of the | |
| extension). | |
| ## Extension issues | |
| We recommend using our [VSCode extension](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust). | |
| Note that there are other VSCode extensions. | |
| Ensure the extension and VSCode is up to date. You can check the latest version | |
| of VSCode on [their website](https://code.visualstudio.com/). You can see your | |
| version in the `Help > About` menu item. VSCode should tell you if it or your | |
| extension are not up to date. | |
| The extension must be able to run Rustup. If Rustup is installed, it must be in | |
| your PATH. Note that if you run VSCode from an icon or launcher, the PATH may | |
| not be the same as from a terminal. You can check this issue by running VSCode | |
| from your terminal (`code` should work). | |
| ## Project issues | |
| It can be useful to determine if a problem is with your environment or with a | |
| project. Try running the VSCode extension with a very simple project. Use `cargo | |
| new foo --bin` to create a new project called `foo`, open the `foo` folder in | |
| VSCode. Add a local variable and a use of it, see if the RLS gives you the type | |
| of the variable on hover and if you can jump to its definition. | |
| If the above works, then you probably have project issues. If it | |
| doesn't, then there is a problem with the environment. | |
| If a project has a lot of dependencies, initial indexing might take a long time. | |
| In general, initial indexing should take about the same time as a full compile of | |
| the project (usually a little less time, but that depends). | |
| If the primary crate of a project is large, it probably won't work well with the | |
| RLS (too slow). Exactly what 'large' means here will depend on how fast your | |
| machine is and how tolerant of latency you are. | |
| Projects with Cargo workspaces will not work (for now). | |
| Projects with non-Cargo build systems will not work (you *might* be able to make | |
| this work with some effort, talk to nrc on Discord). | |
| Rarely, there are problems with the RLS's build model. You can try running | |
| `cargo check` on the command line to emulate the build model outside of the IDE. | |
| ### Crates with large data files | |
| Some crates can have surprisingly large data files. Large data files can slow | |
| down the RLS to the point of crashing (or appearing to crash). Check the json | |
| files in the `target/rls/deps/save-analysis` directory. Anything over 1mb is | |
| suspicious. You can test if this is important by deleting the json file(s) and | |
| restarting the extension (you'd have to do this every time you do a full build, | |
| for example after `cargo clean` or updating the toolchain). | |
| If you find such large data files, please report an issue on this repo. We can | |
| try to optimise the data, or blacklist the crate. | |
| ## Racer vs compiler issues | |
| The RLS uses Racer for code completion, and the compiler for everything else | |
| (such as type on hover). If you are getting code completion options but not type | |
| on hover, etc., then there is probably an issue with the RLS getting data from | |
| the compiler. If you have type on hover, but poor code completion, then it is | |
| probably a Racer issue. | |
| Racer and the rest of the RLS use different data sources for indexing the | |
| standard libraries. If you have Racer problems with the standard libraries, then | |
| it is worth checking the `rust-source` component. If Racer is working, but other | |
| things are not, it is worth checking the `rust-analysis` component (both | |
| components are delivered by Rustup). | |
| ## Logging | |
| When using VSCode extension, you can view error messages and logging in the | |
| Output window, under View > Output, in the 'Rust Language Server' channel | |
| that can be selected in the dropdown menu on the right of the panel. | |
| To see more info in the logs, set `RUST_LOG=rls=debug` in your environment. You | |
| can also set `RUST_LOG=rls_analysis=debug` to see logging specific to the | |
| data analysis. In general, these will be printed to the standard error stream | |
| of the server. | |
| If you are seeing crashes in the logs, you can get a backtrace by setting | |
| `RUST_BACKTRACE=1`. | |
| You can also dump to a file by setting `rust-client.logToFile` to `true` in the | |
| VSCode extension. The file will be in the project root; each time you start the | |
| extension, you'll get a new file. | |
| You can get more info about VSCode and the extension itself by running VSCode | |
| with `--verbose`. However, I have only rarely found this to be useful. You can | |
| also use VSCode's debugger to debug the extension. This can be useful if the | |
| extension hangs. | |
| It might be useful to find the `rls` process and attach a debugger to it. | |
| However, with an optimised build and no debug symbols, this is not likely to be | |
| useful. | |
| ## Library issues | |
| If you get an error like `error while loading shared libraries` while starting | |
| up the RLS, you should try the following: | |
| On Linux: | |
| ``` | |
| export LD_LIBRARY_PATH=$(rustc --print sysroot)/lib:$LD_LIBRARY_PATH | |
| ``` | |
| On MacOS (this might only work if SIP is disabled (depending on how you run the | |
| RLS), you could modify the environment in the client): | |
| ``` | |
| export DYLD_LIBRARY_PATH=$(rustc --print sysroot)/lib:$DYLD_LIBRARY_PATH | |
| ``` | |
| (This should not happen if you are using Rustup, only if building and running | |
| from source). | |
| ## Getting more help | |
| Please feel free to [open an issue](https://github.com/rust-lang/rls/issues/new) | |
| to discuss any problem. | |
| If you use Discord, you can ask in #dev-tools on the Rust lang server. You can | |
| ping nrc. |