首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual Studio代码中Rust程序的远程调试

Visual Studio代码中Rust程序的远程调试
EN

Stack Overflow用户
提问于 2021-08-23 07:22:33
回答 1查看 2.2K关注 0票数 1

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

我想这个序列应该是:

lldb-server.

  • VS

  • 为目标编译Rust程序(用于调试)。

  • 将调试bin文件复制到目标。

  • 在目标上运行它,使用gdbserver或代码连接到远程gdb/lldb,并控制程序进行常规的调试.。
EN

回答 1

Stack Overflow用户

发布于 2021-08-23 07:22:33

扩展

  • 我正在使用锈蚀分析器扩展来进行代码分析。与extension.
  • CodeLLDB扩展 Rust 相比,使用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

代码语言:javascript
复制
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc-8"

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

代码语言:javascript
复制
cargo build --target=aarch64-unknown-linux-gnu

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

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

然后我只做Shift-Ctrl,并选择“锈蚀:货物构建臂”构建任务。

远程调试

目标是将myapp作为低特权用户targetuser (而不是根用户)在targetboard.local上运行。

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

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

在我的VS代码工作区中,我的应用程序在.vscode/launch.json

代码语言:javascript
复制
{
    ...
    "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"]
        }
    ]
}

在我的VS代码工作区中,我的应用程序在.vscode/tasks.json

代码语言:javascript
复制
{
    ...
    "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",
            ],
        },
    ]
}

在我的VS代码工作区中,我为我的应用程序创建了脚本scripts/remote_debug.sh

代码语言:javascript
复制
#!/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启动远程调试。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68888706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档