2010-10-27 102 views
8

我有一個2d陣列矩陣[10] [10],我想在調試時檢查。GDB問題:漂亮 - 打印2D陣列?

我知道我可以在GDB使用

p *[email protected] 

做到這一點,但它輸出這一條線,使其難以閱讀。

有沒有辦法讓這個輸出以任何方式格式化,可以說是矩陣?

+0

在C++或目標C或C或什麼? – 2010-10-27 10:15:40

+0

@Armen:在其中的任何一箇中,讓我們說我有一個數組int matrix [10] [10]。 – PlagueHammer 2010-10-27 17:18:32

+1

'set print array on'會讓gdb打印漂亮 – yuan 2014-01-23 09:18:16

回答

20

GDB的一個重要特徵是在調試代碼執行職能的能力,這樣你就可以實現任何你喜歡的打印,例如:

#include <stdio.h> 

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你可以使用打印功能如下:

(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 
+0

謝謝你的信息 – 2016-08-01 22:34:29

10

你可以隨時在GDB中定義一個函數來做同樣的事情。如果你有以下的C代碼:

#include <stdio.h> 
#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函數。

3

這是最後一篇文章的更有用的擴展。 您也可以使用:打印VAR @ @的cols行

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 
2

你能做到這一點?:

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還沒有嘗試過。這似乎更容易。