debugging-tauri-apps
Debugging Tauri Applications
This skill covers debugging Tauri v2 applications including console debugging, WebView inspection, IDE configurations, and CrabNebula DevTools.
Development-Only Code
Use conditional compilation to exclude debug code from production builds:
// Only runs during `tauri dev`
#[cfg(dev)]
{
// Development-only code
}
// Runtime check
if cfg!(dev) {
// tauri dev code
} else {
// tauri build code
}
// Programmatic check
let is_dev: bool = tauri::is_dev();
// Debug builds and `tauri build --debug`
#[cfg(debug_assertions)]
{
// Debug-only code
}
Console Debugging
Rust Print Macros
Print messages to the terminal where tauri dev runs:
println!("Message from Rust: {}", msg);
dbg!(&variable); // Prints variable with file:line info
Enable Backtraces
For detailed error information:
# Linux/macOS
RUST_BACKTRACE=1 tauri dev
# Windows PowerShell
$env:RUST_BACKTRACE=1
tauri dev
WebView DevTools
Opening DevTools
- Right-click and select "Inspect Element"
Ctrl + Shift + i(Linux/Windows)Cmd + Option + i(macOS)
Platform-specific inspectors: WebKit (Linux), Safari (macOS), Edge DevTools (Windows).
Programmatic Control
tauri::Builder::default()
.setup(|app| {
#[cfg(debug_assertions)]
{
let window = app.get_webview_window("main").unwrap();
window.open_devtools();
// window.close_devtools();
}
Ok(())
})
Production DevTools
Create a debug build for testing:
tauri build --debug
To permanently enable devtools in production, add to src-tauri/Cargo.toml:
[dependencies]
tauri = { version = "...", features = ["...", "devtools"] }
WARNING: Using the devtools feature enables private macOS APIs that prevent App Store acceptance.
VS Code Setup
Required Extensions
| Extension | Platform | Purpose |
|---|---|---|
| vscode-lldb | All | LLDB debugger |
| C/C++ | Windows | Visual Studio debugger |
launch.json Configuration
Create .vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Tauri Development Debug",
"cargo": {
"args": [
"build",
"--manifest-path=./src-tauri/Cargo.toml",
"--no-default-features"
]
},
"preLaunchTask": "ui:dev"
},
{
"type": "lldb",
"request": "launch",
"name": "Tauri Production Debug",
"cargo": {
"args": [
"build",
"--release",
"--manifest-path=./src-tauri/Cargo.toml"
]
},
"preLaunchTask": "ui:build"
}
]
}
Windows Visual Studio Debugger
For faster Windows debugging with better enum support:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch App Debug",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceRoot}/src-tauri/target/debug/your-app-name.exe",
"cwd": "${workspaceRoot}",
"preLaunchTask": "dev"
}
]
}
tasks.json Configuration
Create .vscode/tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"label": "ui:dev",
"type": "shell",
"isBackground": true,
"command": "npm",
"args": ["run", "dev"]
},
{
"label": "ui:build",
"type": "shell",
"command": "npm",
"args": ["run", "build"]
},
{
"label": "build:debug",
"type": "cargo",
"command": "build",
"options": {
"cwd": "${workspaceRoot}/src-tauri"
}
},
{
"label": "dev",
"dependsOn": ["build:debug", "ui:dev"],
"group": {
"kind": "build"
}
}
]
}
Debugging Workflow
- Set breakpoints by clicking the line number margin in Rust files
- Press
F5or select debug configuration from Run menu - The
preLaunchTaskruns the dev server automatically - Debugger attaches and stops at breakpoints
NOTE: LLDB bypasses the Tauri CLI, so
beforeDevCommandandbeforeBuildCommandmust be configured as tasks.
RustRover / IntelliJ Setup
Project Configuration
If your project lacks a top-level Cargo.toml, create a workspace file:
[workspace]
members = ["src-tauri"]
Or attach src-tauri/Cargo.toml via the Cargo tool window.
Run Configurations
Create two configurations in Run | Edit Configurations:
1. Tauri App Configuration (Cargo)
- Command:
run - Additional arguments:
--no-default-features
The --no-default-features flag is critical - it tells Tauri to load assets from the dev server instead of bundling them.
2. Development Server Configuration
For Node-based projects:
- Create an npm Run Configuration
- Set package manager (npm/pnpm/yarn)
- Set script to
dev
For Rust WASM (Trunk):
- Create a Shell Script configuration
- Command:
trunk serve
Debugging Workflow
- Start the development server configuration first
- Click Debug on the Tauri App configuration
- RustRover halts at Rust breakpoints automatically
- Inspect variables and step through code
Neovim Setup
Required Plugins
- nvim-dap - Debug Adapter Protocol client
- nvim-dap-ui - Debugger UI
- nvim-nio - Async dependency for nvim-dap-ui
- overseer.nvim (recommended) - Task management
Prerequisites
Download codelldb from GitHub releases and note the installation path.
DAP Configuration
Add to your Neovim config (init.lua or equivalent):
local dap = require("dap")
-- Configure codelldb adapter
dap.adapters.codelldb = {
type = 'server',
port = "${port}",
executable = {
command = '/path/to/codelldb/adapter/codelldb',
args = {"--port", "${port}"},
}
}
-- Launch configuration for Rust/Tauri
dap.configurations.rust = {
{
name = "Launch Tauri App",
type = "codelldb",
request = "launch",
program = function()
return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/target/debug/', 'file')
end,
cwd = '${workspaceFolder}',
stopOnEntry = false
},
}
UI Integration
local dapui = require("dapui")
dapui.setup()
-- Auto-open/close UI
dap.listeners.before.attach.dapui_config = function()
dapui.open()
end
dap.listeners.before.launch.dapui_config = function()
dapui.open()
end
dap.listeners.before.event_terminated.dapui_config = function()
dapui.close()
end
dap.listeners.before.event_exited.dapui_config = function()
dapui.close()
end
Visual Indicators
vim.fn.sign_define('DapBreakpoint', {
text = 'B',
texthl = 'DapBreakpoint',
linehl = '',
numhl = ''
})
vim.fn.sign_define('DapStopped', {
text = '>',
texthl = 'DapStopped',
linehl = 'DapStopped',
numhl = ''
})
Keybindings
vim.keymap.set('n', '<F5>', function() dap.continue() end)
vim.keymap.set('n', '<F6>', function() dap.disconnect({ terminateDebuggee = true }) end)
vim.keymap.set('n', '<F10>', function() dap.step_over() end)
vim.keymap.set('n', '<F11>', function() dap.step_into() end)
vim.keymap.set('n', '<F12>', function() dap.step_out() end)
vim.keymap.set('n', '<Leader>b', function() dap.toggle_breakpoint() end)
vim.keymap.set('n', '<Leader>o', function() overseer.toggle() end)
vim.keymap.set('n', '<Leader>R', function() overseer.run_template() end)
Development Server Task
Create .vscode/tasks.json for overseer.nvim compatibility:
{
"version": "2.0.0",
"tasks": [
{
"type": "process",
"label": "dev server",
"command": "npm",
"args": ["run", "dev"],
"isBackground": true,
"presentation": {
"revealProblems": "onProblem"
},
"problemMatcher": {
"pattern": {
"regexp": "^error:.*",
"file": 1,
"line": 2
},
"background": {
"activeOnStart": false,
"beginsPattern": ".*Rebuilding.*",
"endsPattern": ".*listening.*"
}
}
}
]
}
NOTE: The development server does not start automatically when bypassing Tauri CLI. Use overseer.nvim or start it manually.
CrabNebula DevTools
CrabNebula DevTools provides real-time application instrumentation including log inspection, performance monitoring, and Tauri event/command analysis.
Features
- Inspect log events (including dependency logs)
- Monitor command execution performance
- Analyze Tauri events with payloads and responses
- Real-time visualization
Installation
cargo add tauri-plugin-devtools@2.0.0
Setup
Initialize DevTools as early as possible in src-tauri/src/main.rs:
fn main() {
// Initialize DevTools only in debug builds
#[cfg(debug_assertions)]
let devtools = tauri_plugin_devtools::init();
let mut builder = tauri::Builder::default();
#[cfg(debug_assertions)]
{
builder = builder.plugin(devtools);
}
builder
.run(tauri::generate_context!())
.expect("error while running tauri application")
}
Usage
When running tauri dev, DevTools automatically opens a web-based interface showing:
- Application logs with filtering
- IPC command calls with timing
- Event payloads and responses
- Performance spans
For full documentation, see CrabNebula DevTools docs.
Quick Reference
| Task | Command/Action |
|---|---|
| Enable backtraces | RUST_BACKTRACE=1 tauri dev |
| Open WebView DevTools | Ctrl+Shift+i / Cmd+Option+i |
| Debug build | tauri build --debug |
| Add DevTools plugin | cargo add tauri-plugin-devtools@2.0.0 |
IDE Comparison
| Feature | VS Code | RustRover | Neovim |
|---|---|---|---|
| Extension/Plugin | vscode-lldb | Built-in | nvim-dap + codelldb |
| Windows Alt | cppvsdbg | Built-in | codelldb |
| Task Runner | tasks.json | Run configs | overseer.nvim |
| Setup Complexity | Medium | Low | High |
Common Issues
- Breakpoints not hit: Ensure
--no-default-featuresis set when building - Dev server not starting: Configure
preLaunchTaskor start manually - App not loading frontend: Dev server must be running before Tauri app starts
- Windows enum display issues: Use cppvsdbg instead of LLDB
More from beshkenadze/claude-code-tauri-skills
distributing-tauri-for-ios
Guides users through distributing Tauri applications to the iOS App Store, including Apple Developer enrollment, Xcode configuration, provisioning profiles, code signing, TestFlight beta testing, and App Store submission processes.
5setting-up-tauri-projects
Helps users create and initialize new Tauri v2 projects for building cross-platform desktop and mobile applications. Covers system prerequisites and setup requirements for macOS, Windows, and Linux. Guides through project creation using create-tauri-app or manual Tauri CLI initialization. Explains project directory structure and configuration files. Supports vanilla JavaScript, TypeScript, React, Vue, Svelte, Angular, SolidJS, and Rust-based frontends.
3understanding-tauri-ecosystem-security
Guides developers through Tauri ecosystem security practices including security auditing, dependency management, vulnerability reporting, and organizational security measures for building secure desktop applications.
3packaging-tauri-for-linux
Guides users through packaging Tauri v2 applications for Linux distributions including AppImage, Debian (.deb), RPM, Flatpak, Snap, and AUR submission.
3distributing-tauri-for-android
Guides the user through distributing Tauri applications for Android, including Google Play Store submission, APK and AAB generation, build configuration, signing setup, and version management.
3migrating-tauri-apps
Assists users with migrating Tauri applications from v1 to v2 stable, and from v2 beta to v2 stable, covering breaking changes, configuration updates, API migrations, and plugin system changes.
2