如何在c/c++场景下调试rust?

2022-12-02 20:46:54 浏览数 (1)

0.效果

背景:最近数据库项目中使用到了rust,是一个扩展,数据库是c写的,也就是c会调用rust,当gdb调试进程时,rust侧代码啥都打不出来,非常苦恼,本文则是解决这个问题。

直接gdb,啥都看不到,全是内部实现。

使用脚本之后,可以清楚看到内容。

1.如何配置

rust官方提供了rust-gdb调试工具,如果你的代码是rust二进制,直接rust-gdb调试是没有问题的,啥都不用做,把rust-gdb下载下来直接用即可,但是我们的场景是c调用rust,而c这边会fork出子进程出来,此时是没有二进制文件的,没法直接使用rust-gdb,因此直接看它的脚本。

在我们场景,使用方式如下:

gdb -p pid

source /home/light/rust-master/src/etc/gdb_load_rust_pretty_printers.py

此时没有报错,就可以使用了,如何做到这一点呢?这里可以直接修改

第一步:下载源码

https://github.com/rust-lang/rust/tree/master/src/etc

第二步:修改脚本

gdb_load_rust_pretty_printers.py,去掉current_objfile(),此时gdb_load_rust_pretty_printers.py文件变为下面这个样子。只需要改下面这个参数即可。

代码语言:javascript复制
import gdb
import gdb_lookup
gdb_lookup.register_printers(gdb)

第三步:环境配置

将刚才的etc目录设置到python path中。

代码语言:javascript复制
 export PYTHONPATH=$PYTHONPATH:/home/light/rust-master/src/etc

第四步:畅享rust-gdb

此时gdb -p pid,source /home/gpadmin/rust-master/src/etc/gdb_load_rust_pretty_printers.py,便可以像pgprint一样输出直观的结果。

0 人点赞