GDB + Rust,如何打印std :: path :: Path函数调用

3
我希望打印调用std::path::Path实例函数的结果。
我使用 Rust 1.43 和 GDB 9.1。
main.rs
use std::path::Path;

fn main() {
    let path = Path::new("/home/sweet/home");
    println!("The path: {}", path.display());
}

当我尝试使用rust-gdb进行调试时,我得到了这个:
$ rust-gdb target/debug/poc-gdb-pathbuf
...
>>> start
>>> n
>>> print path
$1 = (*mut std::path::Path) 0x55555557c000
>>> print &path
$2 = (*mut *mut std::path::Path) 0x7fffffffe0c0
>>> print *path
$3 = std::path::Path {
  inner: std::ffi::os_str::OsStr {
    inner: std::sys_common::os_str_bytes::Slice {
      inner: 0x55555557c000
    }
  }
}
>>> print *path.is_absolute()
Could not find function named 'std::path::Path::is_absolute'
>>> print path.is_absolute()
Could not find function named 'std::path::Path::is_absolute'
>>> print path.display()
Function 'std::path::Path::display' takes no arguments
>>> print *path.display()
Function 'std::path::Path::display' takes no arguments

如您所见,我无法正确调用单个Path实例函数,它要么告诉我该函数不存在(但是存在的),要么告诉我它不需要参数(我没有传递任何参数)。

对于简单的最小结构函数调用,我没有任何问题,下面是一个可行的示例。

main.rs

struct Something {
    x: u8
}

impl Something {
    pub fn new(x: u8) -> Self {
        Something { x }
    }

    pub fn show(&self) -> u8 {
        return self.x
    }
}

fn main() {
    let something = Something::new(10);
    something.show();
}

rust-gdb会话:

$ rust-gdb target/debug/poc-gdb-something
...
>>> start
>>> n
>>> print something
$1 = poc_gdb_pathbuf::Something {
  x: 10
}
>>> print something.show()
$2 = 10

我猜测可能是关于Path实例是指针的问题,但是取消引用并不能帮助解决问题...
为什么Path调用不起作用?我错过了什么吗?

https://doc.rust-lang.org/std/macro.dbg.html - Stargateur
1个回答

5

Rust编译器不会生成描述其输出的完整调试信息,这最终妨碍了gdb执行相关任务的能力。

由于traits没有被描述,所以gdb无法通过traits进行调用。有一个Rust bug与此有关,请参见此处

同样地,打印Path也很困难,因为Rust编译器不会为动态大小的类型生成调试信息。我不愿直接将其混合到gdb中;在这种情况下,可以编写自定义Python代码来解码这些对象,通过对其布局进行(可能是无效的)假设。针对这种情况,请参见此Rust bug


我担心这将是真正的答案,谢谢。我会保持问题开放,以防有一天问题得到解决和/或可以添加更多信息。 - Terseus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接