我正在调试一些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": {}
}
]
}
2条答案
按热度按时间t3irkdon1#
我注意到你发布的图片在局部变量窗口中显示了
self
和cx
的局部变量。如果该局部变量窗口是针对当前帧的--显示汇编而不是源代码的那个--那么你必须有该帧的调试信息(*)。如果这一切都是真的,那么很有可能您只是没有这个函数的源文件的本地副本。也许您下载了rust标准库的调试版本,这就是为什么它有调试信息的原因?您可以通过运行以下命令来确定:
如果存在CompileUnit和Function等项,则确实存在此帧的调试信息。
lldb的所有测试“不要在没有调试信息的代码中停止”都是关于调试信息的存在,而不是我们是否能找到相关的源代码。因此,如果你有一个函数的调试信息,并且你的程序在单步执行过程中进入了那个函数,lldb将在那里停止。
您可以通过将库名添加到lldb设置
target.process.thread.step-avoid-libraries
来逐个库地修改此行为。这是一个用冒号分隔的库名或路径列表。如果step
(而不是step-instruction
)操作在该列表中的库中结束,lldb将再次单步执行,而不管它是否具有调试信息-我认为这是您想要的行为。或者,如果您希望单步执行该函数,只要您可以看到源代码,您就可以下载与您已安装的rust库匹配的源代码。您可能还必须使用
target.source-map
设置来告诉lldb源代码在本地系统中的位置。(*)注意,如果你为非调试函数注册了一个“帧识别器”,局部变量可能会出现在该函数中。lldb没有内置的Rust识别器,所以你必须手动添加,这使得这种可能性不大。听起来你并没有为这个函数做什么特殊的事情。
6mzjoqzu2#
如果您使用的是CodeLLDB扩展,您可以通过进入文件-〉首选项-〉设置(Ctrl+逗号)并在扩展-〉CodeLLDB下选择Lldb下的选项“从不”来禁用此代码分解:显示反汇编。
对我来说,这阻止了调试会话进入汇编代码。例如,如果我的assert!()有错误,会话将退出,而不是先在汇编代码中停止,然后退出。