rust-lldb 漂亮打印数组

问题描述 投票:0回答:1

我注意到

rust-lldb
根据上下文以不同的方式漂亮地打印数组:

   1    fn init(array: &mut[i32; 9]) {
   2      array[4] = 333;
-> 3    }
   4    
   5    fn main() {
   6      let mut array: [i32; 9] = [18; 9];
   7      init(&mut array);
(lldb) p array[0]
(int[9]) {
  [0] = 18
  [1] = 18
  [2] = 18
  [3] = 18
  [4] = 333
  [5] = 18
  [6] = 18
  [7] = 18
  [8] = 18
}

当我走出

init
时,我得到了不同的打印格式:

   4    
   5    fn main() {
   6      let mut array: [i32; 9] = [18; 9];
-> 7      init(&mut array);
   8      println!("{}", array[4]);
   9    }
Target 0: (main) stopped.
(lldb) p array[0]
(int) 18
(lldb) ### x/9u &array <--- this works fine

打印格式如何在这些上下文之间发生变化?

// main.rs

fn init(array: &mut[i32; 9]) {
  array[4] = 333;
}

fn main() {
  let mut array: [i32; 9] = [18; 9];
  init(&mut array);
  println!("{}", array[4]);
}

编译并运行:

$ rustc -g main.rs
$ rust-lldb --source ./commands.dbg ./main

这是确切的命令:

# commands.dbg

b main.rs:3
run
p array[0]
next
p array[0]
### x/9u &array <--- this works fine
rust lldb
1个回答
0
投票

LLDB 以以 C 为中心的方式看待事物,而自然的 Rust 语法却掩盖了这一点。

这些情况之间的区别在于,类型

array
&mut [i32; 9]
中断点处的
init
,但其
[i32; 9]
位于
main()
中的下一步。在底层,
&mut
引用只是一个指针,LLDB在查看
p array
时会这样说:

// in init()
(lldb) p array
(int (*)[9]) $2 = 0x00007fffffffdba4

// in main()
(lldb) p array
(int [9]) $5 = {
  [0] = 18
  [1] = 18
  [2] = 18
  [3] = 18
  [4] = 333
  ...

请注意

int (*)[9]
(指向
int
数组的指针)和
int [9]
int
数组)之间的区别。

所以当你打印

array[0]
时,它们会做不同的事情。在
init()
中,您只是取消引用引用,从而打印数组本身(因为这就是
[0]
在 C 中的工作方式),而在
main()
中,您只是访问数组的第一个元素:

// in init()
(lldb) p array[0]
(int [9]) $0 = {
  [0] = 18
  [1] = 18
  [2] = 18
  [3] = 18
  [4] = 333
  ...

// in main()
(lldb) p array[0]
(int) $6 = 18

您的

x/9u &array
中的
main()
本质上为您提供与简单的
p array
相同的功能,只是更加冗长。

© www.soinside.com 2019 - 2024. All rights reserved.