随便玩玩lldb (二)

前言

首先,笔者电脑的操作系统是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里面

rust-gdb and rust-lldb not working using stable-x86_64-pc-windows-gnu toolchain · Issue #2838 · rust-lang/rustuphttps://github.com/rust-lang/rustup/issues/2838但是,笔者有新的想法。

正文

笔者在前面博客的基础上

随便玩玩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不支持吧(-. -)

就这样,

最后,应该其他类型也有变化,笔者就不展示了。

为什么调用不了。。。。。。。。。。。。。。。

相关推荐
京东零售技术1 小时前
DongSQL数据库内核V1.1.0介绍
后端
星轨初途1 小时前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法
b***65321 小时前
GO 快速升级Go版本
开发语言·redis·golang
LibSept24_1 小时前
会议透镜(Meeting Lens):基于 Rokid CXR-M 的 AI 会议纪要实战
后端
课程xingkeit与top1 小时前
高性能多级网关与多级缓存架构落地实战(超清完结)
后端
课程xingkeit与top1 小时前
SpringBoot2 仿B站高性能前端+后端项目(完结)
后端
课程xingkeit与top1 小时前
AI Agent智能应用从0到1定制开发(完结)
后端
Carve_the_Code1 小时前
分布式订单系统:订单号编码设计实战
java·后端
Home1 小时前
23种设计模式之代理模式(结构型模式二)
java·后端