debugging 我可以避免调试器在汇编代码中停止吗?

vc6uscn9  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(153)

我正在调试一些Rust代码,它会传递如下抛出位置:

我认为这是一些汇编代码从生 rust 的库。有什么办法可以避免停止在这里?并只是去抛出可读的代码?我已经取消标记的选项

Disassembly View: Show Source Code
Show Source Code in Disassembly View.

我的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": "launch",
            "cargo": {
                "args": [
                    "build",
                    "--bin=myproject",
                    "--package=myproject"
                ],
                "filter": {
                    "name": "myproject",
                    "kind": "bin"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}",
            "env": {}
        }
    ]
}
t3irkdon

t3irkdon1#

我注意到你发布的图片在局部变量窗口中显示了selfcx的局部变量。如果该局部变量窗口是针对当前帧的--显示汇编而不是源代码的那个--那么你必须有该帧的调试信息(*)。
如果这一切都是真的,那么很有可能您只是没有这个函数的源文件的本地副本。也许您下载了rust标准库的调试版本,这就是为什么它有调试信息的原因?您可以通过运行以下命令来确定:

(lldb) image lookup -va $pc

如果存在CompileUnit和Function等项,则确实存在此帧的调试信息。
lldb的所有测试“不要在没有调试信息的代码中停止”都是关于调试信息的存在,而不是我们是否能找到相关的源代码。因此,如果你有一个函数的调试信息,并且你的程序在单步执行过程中进入了那个函数,lldb将在那里停止。
您可以通过将库名添加到lldb设置target.process.thread.step-avoid-libraries来逐个库地修改此行为。这是一个用冒号分隔的库名或路径列表。如果step(而不是step-instruction)操作在该列表中的库中结束,lldb将再次单步执行,而不管它是否具有调试信息-我认为这是您想要的行为。
或者,如果您希望单步执行该函数,只要您可以看到源代码,您就可以下载与您已安装的rust库匹配的源代码。您可能还必须使用target.source-map设置来告诉lldb源代码在本地系统中的位置。
(*)注意,如果你为非调试函数注册了一个“帧识别器”,局部变量可能会出现在该函数中。lldb没有内置的Rust识别器,所以你必须手动添加,这使得这种可能性不大。听起来你并没有为这个函数做什么特殊的事情。

6mzjoqzu

6mzjoqzu2#

如果您使用的是CodeLLDB扩展,您可以通过进入文件-〉首选项-〉设置(Ctrl+逗号)并在扩展-〉CodeLLDB下选择Lldb下的选项“从不”来禁用此代码分解:显示反汇编
对我来说,这阻止了调试会话进入汇编代码。例如,如果我的assert!()有错误,会话将退出,而不是先在汇编代码中停止,然后退出。

相关问题