在Visual Studio代码中实现Rust程序的远程调试 [英] Remote debug of Rust program in Visual Studio Code

查看:0
本文介绍了在Visual Studio代码中实现Rust程序的远程调试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个在基于64位ARM处理器的嵌入式Linux板上运行的Rust程序。目标的嵌入式Linux是使用Yocto(Dunfell)构建的。我的Rust开发环境是运行在Linux上的Visual Studio代码(Ubuntu)。如何将其设置为在目标板上进行程序的远程调试?

我预计顺序如下:

  • 编译目标的Rust程序(用于调试)。
  • 将调试bin文件复制到目标。
  • 使用gdb服务器或lldb-server在目标系统上运行它。
  • VS代码连接到远程gdb/lldb,并控制程序进行常规调试。

推荐答案

扩展

  • 我正在使用锈迹分析器扩展进行代码分析。它比Rust扩展更好。
  • CodeLLDB扩展以启用使用lldb调试Rust程序。

交叉编译

目标板是64位ARM处理器,所以我想使用Rust为目标aarch64-unknown-linux-gnu交叉编译。

我使用的是Ubuntu18.04LTS(它很旧,但我必须使用它来支持用旧的Yocto版本构建的旧项目)。我使用apt安装了Ubuntu包gcc-8-aarch64-linux-gnu。在更新的Ubuntu上,也许我可以安装一个更现代的包,如gcc-11-aarch64-linux-gnu

在我的~/.cargo/config中:

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc-8"

然后,我可以使用以下命令手动使用cargo进行交叉编译:

cargo build --target=aarch64-unknown-linux-gnu

然后在.vscode/tasks.json中的我的VS代码工作区中的VS代码中进行交叉编译:

{
    ...
    "tasks": [
        ...
        {
            "label": "rust: cargo build ARM"
            "type": "cargo",
            "command": "build",
            "args": ["--target=aarch64-unknown-linux-gnu"],
            "problemMatcher": [
                "$rustc"
            ],
            "group": "build",
        },
    ]
}

然后,我只需执行Shift-Ctrl-B组合键,并选择";rust:Cargo Build Arm;Build任务。

远程调试

目标是以低权限用户targetuser(而不是超级用户)身份在targetboard.local上运行myapp

在VS代码中,CodeLLDB扩展使用lldb来调试Rust程序。但是,lldb是用Yocto为目标硬件编写的大型编译程序。但是,它可以很好地连接到在目标板上运行的gdbserver。在目标板上运行的嵌入式Linux镜像只需要gdbserver

目标板上还需要运行SSH服务器,支持rsync或普通SSH复制。rsync很好,因为它可以更快地将可执行文件复制到目标。

在myapp的My VS Code工作区中,.vscode/launch.json

{
    ...
    "configurations": [
        ...
        {
            "type": "lldb",
            "request": "custom",
            "name": "Remote executable 'myapp'",
            "preLaunchTask": "rust: remote ARM debug setup",
            "targetCreateCommands": ["target create ${workspaceFolder}/target/aarch64-unknown-linux-gnu/debug/myapp"],
            "processCreateCommands": ["gdb-remote targetboard.local:17777"]
        }
    ]
}

在myapp的My VS Code工作区中,.vscode/tasks.json

{
    ...
    "tasks": [
        ...
        {
            "label": "rust: remote ARM debug setup",
            "type": "shell",
            "command": "${workspaceFolder}/scripts/remote_debug.sh",
            "args": [ "${workspaceFolder}", "targetboard.local", "17777" ],
            "group": "none",
            "dependsOn": [
                "rust: cargo build ARM",
            ],
        },
    ]
}

在myapp的VS代码工作区中,我创建了脚本scripts/remote_debug.sh

#!/bin/bash

VSCODE_WS="$1"
SSH_REMOTE="$2"
GDBPORT="$3"

APP="myapp"
TARGET_ARCH="aarch64-unknown-linux-gnu"
BUILD_BIN_FILE="${VSCODE_WS}/target/${TARGET_ARCH}/debug/${APP}"
TARGET_USER="targetuser"
TARGET_BIN_FILE="/home/targetuser/${APP}"
TARGET_CWD="/var/lib/myapp"

ssh "${TARGET_USER}@${SSH_REMOTE}" "killall gdbserver ${APP}"

if ! rsync -avz "${BUILD_BIN_FILE}" "${TARGET_USER}@${SSH_REMOTE}:${TARGET_BIN_FILE}"; then
    # If rsync doesn't work, it may not be available on target. Fallback to trying SSH copy.
    if ! scp "${BUILD_BIN_FILE}" "${TARGET_USER}@${SSH_REMOTE}:${TARGET_BIN_FILE}"; then
        exit 2
    fi
fi

ssh -f "${TARGET_USER}@${SSH_REMOTE}" "sh -c 'cd ${TARGET_CWD}; nohup gdbserver *:${GDBPORT} ${TARGET_BIN_FILE} > /dev/null 2>&1 &'"
目标CWD/var/lib/myapp需要具有targetuser的正确用户权限。我可以改为指定/home/targetuser

设置完成后,我只需在VS代码中按F5,它将进行编译,将文件复制到目标板,并通过gdbserver开始远程调试。

这篇关于在Visual Studio代码中实现Rust程序的远程调试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆