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一样输出直观的结果。