前言
首先,笔者电脑的操作系统是windows ,在rust中使用的工具链是stable-x86_64-pc-windows-msvc。
但是这个工具链无法使用rust-lldb,什么意思,如下
截止到目前,笔者在终端运行rust-lldb,如下
❯ rust-lldb
error: the 'rust-lldb.exe' binary, normally provided by the 'rustc' component, is not applicable to the 'stable-x86_64-pc-windows-msvc' toolchain
说白了,就是无法使用在stable-x86_64-pc-windows-msvc里面
正文
笔者在前面博客的基础上
随便玩玩lldb-CSDN博客
https://blog.csdn.net/qq_63401240/article/details/155245106?spm=1001.2014.3001.5502继续操作。
笔者直接给出一个路径
C:\Users\26644\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\etc
其中26644是笔者的用户目录,这个可以看个人切换,其他不会变。
看看这个路径里面有什么东西

笔者的终端是nushell。
可以发现,里面有10个文件,重点关注四个文件,笔者把它们复制到test-lldb目录下。
看看lldb_types.py里面有什么

这里面好像全是类型,有什么Struct,Tuple

还有什么正则表达式的东西。不知道是干什么的
看看lldb_provider.py文件
这里面好像全是函数和类
比如
python
class StdCellSyntheticProvider:
"""Pretty-printer for std::cell::Cell"""
def __init__(self, valobj: SBValue, _dict: LLDBOpaque):
self.valobj = valobj
self.value = valobj.GetChildMemberWithName("value").GetChildAtIndex(0)
def num_children(self) -> int:
return 1
def get_child_index(self, name: str) -> int:
if name == "value":
return 0
return -1
def get_child_at_index(self, index: int) -> SBValue:
if index == 0:
return self.value
return None
def update(self):
pass
def has_children(self) -> bool:
return True
从注释可以看出------**漂亮地打印 std::cell::Cell,**应该这样意思。
哦,这里面应该就是支持rust的类型和操作。

1322行,有点多
看看lldb_lookup.py

这里面没有什么东西,就几个函数,返回一些类型,不知道干什么的
看看lldb_commands
笔者复制一段过来看看
type synthetic add -l lldb_lookup.synthetic_lookup -x ".*" --category Rust
type summary add -F _ -e -x -h "^.*$" --category Rust
其中的意思,有点意思。
首先,第一句中,大致如下
type synthetic add:注册一个synthetic child provider,显示其子成员。
-l lldb_lookup.synthetic_lookup : 使用lldb_lookup.py 中的 synthetic_lookup 函数。
-x ".*" : 正则表达式匹配所有类型名。
--category Rust:归入Rust类别。
查一下 synthetic 是什么意思
SYNTHETIC中文(简体)翻译:剑桥词典
https://dictionary.cambridge.org/zhs/%E8%AF%8D%E5%85%B8/%E8%8B%B1%E8%AF%AD-%E6%B1%89%E8%AF%AD-%E7%AE%80%E4%BD%93/syntheticsynthetic 翻译为合成的,人造的。
说白了,就是添加一个类,更好地展示类型。
第二句的意思,大致如下
type summary add : 注册一个summary formatter。
-F lldb_lookup.summary_lookup : 使用 lldb_lookup.py 中的 summary_lookup 函数生成摘要。
-e : 展开类型定义。
-x : 使用正则表达式匹配。
-h "^.*$" : 匹配所有类型。
--category Rust : 归入Rust类别。
summary是总结、概述的意思。什么意思,意思就是对类型做出总结。
说白了,就是添加一个函数或者类,简洁地或者简单地展示类型。
lldb_commands文件里面有许多这样的命令,笔者就不展示了,总之,这个文件的意思就是为Rust注册新的命令。
注册
看了看,现在注册这个
首先,笔者在桌面打开终端,然后运行run,打开lldb。
在lldb里面执行命令type category list
结果如下
(lldb) type category list
Category: default (enabled)
Category: VectorTypes (enabled, applicable for language(s): objective-c++)
Category: system (enabled, applicable for language(s): objective-c++)
可以发现这就命令------显示可以使用语言的目录
发现有三个,笔者也不知道是什么东西。
然后,笔者在test-lldb目录下,其中目录结构如下

笔者把那四个文件复制过来
在.lldbinit文件中,其中内容如下
command script import rust_types.py
command script import lldb_providers.py
command script import lldb_lookup.py
command source lldb_commands
command source 是 LLDB 的一个内置命令,用于从文件中批量读取并执行 LLDB 命令
启动lldb,结果如下

有一个警告,但应该不影响,执行type category list
结果如下

可以发现多个一个目录------Rust(enabled)。
有点意思。
测试一下
笔者在其他地方,新建一个test-lldb目录,变成一个rust项目,复制前面的文件和内容。
笔者使用rustrover打开项目。
大致结构如下

在main.rs中,内容如下
rust
#[derive(Debug)]
struct Student{
id:u32,
name:String,
}
fn main() {
let a=1;
let s=Student{
id:100,
name:"hello world".to_string(),
};
println!("{:?}",s);
}
其中二进制文件的名字叫start.exe

笔者打开终端,在根目录下启动lldb,如下
run target/debug/start.exe
结果如下

启动成功。
12行设置断点
b src/main.rs:12

在lldb里面运行run,启动

下面还有一个警告,说没有插件为rust,吓笔者一跳,笔者以为没成功,又执行了命令
type category list

发现Rust是可以的,没问题。继续
执行两次next------n。

然后笔者,执行fr v
结果如下
**(lldb) fr v
(int) a = 1
(int) a = 1
(start::Student) s = {
id = 100
name = "hello world" {0\] = 'h' \[1\] = 'e' \[2\] = 'l' \[3\] = 'l' \[4\] = 'o' \[5\] = ' ' \[6\] = 'w' \[7\] = 'o' \[8\] = 'r' \[9\] = 'l' \[10\] = 'd' } }**
啊,红红火火恍恍惚惚,哈哈哈哈哈,成功了
笔者重新运行lldb,然后选择禁用rust
type category disable Rust
启动,看看结果

这就是原来的格式,有什么name,vec,buf之类的
笔者使用rustrover里面的lldb展示,结果如下

可以看出rustrover里面的lldb应该也加载了python脚本。
不然不会这样显示的
总之,使用添加了命令之后的lldb展示,更简洁。
感觉可以自定义python脚本啊,这感觉有点意思,以后再来玩玩。
就这样。
这就算是windows版本的的rust-lldb
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
未能理解的事情
笔者看了如下大佬的博客
【Rust调试难题破解】:5个你不知道的LLDB与rust-gdb实战技巧-CSDN博客
https://blog.csdn.net/AlgoInk/article/details/153318682笔者发现如下东西

居然在lldb里面调用了unwrap ,或者说在lldb里面调用了rust的函数
但是笔者一直都没有成功,不知道为什么
笔者设置了debug=True,还是不成功,笔者一直未能理解

最搞的事情是RustRover里面一直有调用提示,笔者不理解,为什么调用不了
不是,笔者直觉是可以调用的,就是不行,就是调用不了。。。。。。。。。。。。。
可能是windows不支持吧(-. -)

就这样,
最后,应该其他类型也有变化,笔者就不展示了。
为什么调用不了。。。。。。。。。。。。。。。
