用于Rust的逐步交互式调试器?


80

如何调试锈病应用步步交互像我能够与红宝石“撬”呢?

我希望能够在达到断点时实时查看并最好实时更改变量。是否有任何生产准备完成的项目?


您可以使用gdb。除此之外,我正在为MIR(在miri之上实现)开发步进器,这将使您可以在一种虚拟机上进行调试。
oli_obk '16

@ker:哦!miri已经足够接近完成了吗?我以为还处于初期。
Matthieu M.

@MatthieuM .:仍然有些东西不起作用(例如函数指针),但是它正在慢慢到达那里。
oli_obk


4
@Dimon被认为是Stack Overflow(和Reddit)礼节,旨在告知将来其他地方的搜索者可能会找到答案。这样,他们就有更多机会获得有用的信息。如果他们要说的话已经被覆盖在其他位置,则还可以节省应答者的时间。
Shepmaster

Answers:


53

我发现VS CodeCodeLLDB扩展的可用性很高

  1. 安装VS代码
  2. 从VS Code中搜索并安装扩展Rust或更新的rust-analyzer
  3. 检查必备条件并为您的平台设置CodeLLDB
  4. 从VS Code中搜索并安装扩展CodeLLDB
  5. LLDB调试器添加了可从其启动调试器的主菜单项“调试”。首次启动调试时,必须选择环境(调试器):选择LLDB。
  6. 当您选择LLDB时,launch.json将打开一个文件,如果没有打开,则将其放在.vscode文件夹下
  7. launch.json应该看起来像这样:

    {
        // Use IntelliSense to learn about possible attributes.
        // Hover to view descriptions of existing attributes.
        // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "type": "lldb",
                "request": "launch",
                "name": "Debug",
                "program": "${workspaceRoot}/target/debug/hello_world",
                "args": [],
                "cwd": "${workspaceRoot}/target/debug/",
                "sourceLanguages": ["rust"]
            }
        ]
    }
    
  1. 如果要保持通用性,并且仅编译与cargo文件夹名称匹配的二进制文件,则可以使用$ {workspaceRootFolderName}变量替代“ program”键:

    {
        "version": "0.2.0",
        "configurations": [
            {
                "type": "lldb",
                "request": "launch",
                "name": "Debug",
                "program": "${workspaceRoot}/target/debug/${workspaceRootFolderName}",
                "args": [],
                "cwd": "${workspaceRoot}/target/debug/",
                "sourceLanguages": ["rust"]
            }
        ]
    }
    

这是有关Rust和VS Code的一些博客文章:


好答案!如果您能解释为什么添加这些博客文章,并引用一个段落来显示它们的相关性,那将是很棒的。
凯尔(Kyll)'18

好吧,我将这些帖子添加为实际操作案例!
Cirelli94 '18 -10-8

26

Rust编译器生成带有本机调试信息(符号)信息的本机二进制文件,因此任何本机调试器都可以。如果您使用的是Rust的MSVC ABI版本,则意味着gdblldb,或者Windows调试器(WinDBG或只是Visual Studio)。如果您希望获得集成的体验,则可以使用RustDT(在Windows上进行设置如何设置GDB以在Windows中调试Rust程序?)。请注意,您可能会在调试MSVC ABI Rust程序时遇到如何检查变量值的问题?在Windows上则为https://github.com/rust-lang/rust/issues/33062(在Mac上)。


2
有了gdb 7.12,现在有了适当的支持,而不仅是“有效,因为它已编译为本机”。
domen'2

7

对于图形调试器,有gdbgui。它适用于Linux,Windows和MacOS。它使用浏览器作为显示并与调试器进行交互。


3
回答我自己,尽管gdbgui很有用,但是我发现VS Code调试器现在可以很好地工作了。
psiphi75

2

我有gdb 7.11,并且与gdb本机相比,rust-gdb命令似乎提供了更多与rust相关的信息。例如,rust-gdb正确显示了具有全名的rust对象,而gdb根本不显示它们。
在下面的示例中,gdb现在将显示所有粗体部分。

$ 1 = Args = {inner = ArgsOs = {inner = Args = {iter = IntoIter = {buf = NonNull = {pointer = NonZero <* const std :: ffi :: os_str :: OsString> = {0x7ffff6c20060}}},幻影= PhantomData,上限= 1,ptr = 0x7ffff6c20060,结束= 0x7ffff6c20078},_ dont_send_or_sync_me = PhantomData <* mut()> }}}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.