【问题标题】:Printing int **x in GDB在 GDB 中打印 int **x
【发布时间】:2017-07-10 05:32:18
【问题描述】:

我有一个指向数组的指针数组(称为板)。 我想以正常方式打印它(这在 GDB 中很难)。

int col = 64, row = 2;
int **board = new int*[col];
for(int i = 0; i < col; i++)
    board[i] = new int[row];

我尝试了以下命令:

p *array@len(问题是它以十六进制值打印,而不是整数)

x/100w array(它向下滚动太多以至于我什至看不到值)

*(T (*)[N])p(其中 p 是数组,T 是数组类型,N 是它的大小)[只是打印不准确]

【问题讨论】:

  • 你应该更喜欢 C++ containers。你用这种方式编码是在自找麻烦。

标签: c++ arrays pointers multidimensional-array gdb


【解决方案1】:

我想正常打印

最好的办法是编写一个print_board 例程,然后您可以从 GDB 调用它。

(这在 GDB 中相当困难)。

那是因为让事情变得艰难。

问题在于,您的板子不是在内存中连续(按照惯例,在 GDB 中打印很简单),而是分散在 64 个单独的块中,每个块有 2 个值。

由于您使用的是 C++,因此最好使用向量向量:

vector<vector<int>> board;
board.resize(col);
for (int i = 0; i < col; i++) {
  board[i].resize(row);
}

(gdb) print board
$1 = std::vector of length 64, capacity 64 =
 {std::vector of length 2, capacity 2 = {0, 0},
  std::vector of length 2, capacity 2 = {0, 0},
  ...

附:提问时,显示实际代码会有所帮助。您的问题的board 类型错误,并且将boardarray 混合在一起。

更新:

我该怎么做(使用 GDB 中的 print_board)?

这是一个例子。假设您的源代码如下所示:

 1  #include <stdio.h>
 2  
 3  int main()
 4  {
 5    int col = 16, row = 2;
 6    int **board = new int*[col];
 7  
 8    for (int i = 0; i < col; i++) {
 9      board[i] = new int[row];
10    }
11  
12    // Initialize elements to something interesting, so we can see them
13    // printed.
14    for (int i = 0; i < col; i++)
15      for (int j = 0; j < row; j++)
16        board[i][j] = 100*i + j;
17  
18    return 0;
19  }
20  
21  void print_board(int **board, int col, int row)
22  {
23    for (int j = 0; j < row; j++) {
24      for (int i = 0; i < col; i++) {
25        printf("\t%d", board[i][j]);
26      }
27      printf("\n");
28    }
29  }

然后,使用 GDB:

gdb -q ./a.out
(gdb) break 18
(gdb) run

Breakpoint 2, main () at t.cc:18
18    return 0;

(gdb) call print_board(board, col, row)
    0   100 200 300 400 500 600 700 800 900 1000    1100    1200    1300    1400    1500
    1   101 201 301 401 501 601 701 801 901 1001    1101    1201    1301    1401    1501

【讨论】:

  • 向量的向量共享您发现的内存不连续的问题
  • @M.M 确实如此,但是vector pretty-printer 解决了那个问题。
  • 实际上,这个答案根本没有帮助。我没有说如何打印“向量的向量”。我尝试了 print_board,但没有找到该命令。
  • @Siliproksi 您应该自己实现print_board 命令(在您自己的代码中)。
  • @EmployedRussian 而且我可以将它用作 GDB 中的命令吗?我该怎么做?
猜你喜欢
  • 1970-01-01
  • 2012-01-12
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 2011-07-24
  • 2015-11-24
  • 1970-01-01
相关资源
最近更新 更多