GDB问题:漂亮打印2Darrays?

我有一个2d数组矩阵[10] [10],我想在调试时检查。

我知道我可以在GDB中使用

p *matrix@10 

但它在一行中输出,使其难以阅读。

有没有办法让这个输出以任何方式格式化,让我们说作为一个矩阵?

GDB的一个重要特性是在调试代码中执行函数的能力,因此您可以实现您喜欢的任何打印,例如:

 #include  int matrix[10][10]; void print(int matrix[10][10]) { int i, j; for (i = 0; i < 10; ++i) { for (j = 0; j < 10; ++j) printf("%d ", matrix[i][j]); printf("\n"); } } int main() { int i, j; for (i = 0; i < 10; ++i) for (j = 0; j < 10; ++j) matrix[i][j] = i*10 + j; return 0; } 

使用-g开关编译此代码并在GDB下运行后,您可以使用print函数,如下所示:

 (gdb) call print(matrix) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 

你总是可以在GDB中定义一个函数来做同样的事情。 如果您有以下c代码:

 #include  #define ARRAY_SIZE 5 void printArray(int array[ARRAY_SIZE][ARRAY_SIZE]) { int y; for (y = 0; y < ARRAY_SIZE; y++) { printf("[%d,%d,%d,%d,%d]\n", array[y][0], array[y][1], array[y][2], array[y][3], array[y][4]); } } int main(int argc, char *argv[]) { int matrix[ARRAY_SIZE][ARRAY_SIZE] = { {1,2,3,4,5}, {5,1,2,3,4}, {4,5,1,2,3}, {3,4,5,1,2}, {2,3,4,5,1}, }; printArray(matrix); return 0; } 

然后,您可以定义以下GDB函数(或类似的函数):

 (gdb) define printMatrix Type commands for definition of "printmatrix". End with a line saying just "end". >set $arr = $arg0 >set $y = 0 >while $y < 5 >printf "[%d,%d,%d,%d,%d]\n",$arr[$y][0],$arr[$y][1],$arr[$y][2],$arr[$y][3],$arr[$y][4] >set $y = $y + 1 >end >end 

这将导致以下输出:

 (gdb) printMatrix matrix [1,2,3,4,5] [5,1,2,3,4] [4,5,1,2,3] [3,4,5,1,2] [2,3,4,5,1] (gdb) 

您可以轻松地在GDB函数中使用嵌套的while循环。 并且,如前面的答案中所述,您始终可以从GDB中调用程序中的printArray函数。

这是上一篇文章的更有用的扩展。 您还可以使用:print var @ cols @ rows

 define printMatrix set $arr = $arg0 set $rows = $arg1 set $cols = $arg2 set $i = 0 printf "\n" while $i < $rows set $j = 0 while $j < $cols printf "%8.4f,",$arr[$i*$cols + $j] set $j = $j + 1 end printf "\n" set $i = $i + 1 end 

你能做这个吗?:

 p *((double (*)[3][3])pointerToMatrix3x3) (double [3][3]) $6 = { [0] = ([0] = 1821.8790830216928, [1] = 0, [2] = 1622.4513098457062) [1] = ([0] = 0, [1] = 1172.3930433142486, [2] = 1314.4812787191868) [2] = ([0] = 0, [1] = 0, [2] = 1) p *((double (*)[4])pointerToVector4) (double [3]) $7 = ([0] = 1821.8790830216928, [1] = 0, [2] = 1622.4513098457062) 

它在lldb中工作 – 没有在gdb中尝试过。 看起来好多了。