2010-10-27 16 views
8

Ho una matrice matrice 2d [10] [10] che vorrei ispezionare in fase di debug.Domanda GDB: Pretty-Printing un array 2D?

ho capito che posso fare questo in GDB usando

p *[email protected] 

Ma Risulterà in una linea, rendendo difficile la lettura.

C'è un modo per avere questo output formattato in alcun modo, diciamo come una matrice?

+0

in C++ o obiettivo C o C o cosa? –

+0

@Armen: in ognuna di esse, diciamo che ho una matrice int matrice [10] [10]. – PlagueHammer

+1

'imposta l'array di stampa su' renderà la stampa gdb carina – yuan

risposta

20

Una caratteristica importante del GDB è la capacità di eseguire le funzioni nel codice di debug, in modo da poter implementare tutto ciò che ti piace la stampa, ad esempio:

#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; 
} 

Dopo aver compilato questo codice con opzione -g e funzionante sotto GDB è possibile utilizzare la funzione di stampa nel modo seguente:

(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

grazie per le informazioni –

10

si può sempre definire una funzione in GDB per fare la stessa cosa. Se tu avessi il seguente codice 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; 
} 

Si potrebbe quindi definire la seguente funzione GDB (o qualcosa di simile ad esso):

(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 

che comporterebbe il seguente output:

(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) 

Si potrebbe altrettanto facilmente utilizzare annidato mentre i loop nella funzione GDB. E, come indicato in una risposta precedente, puoi sempre chiamare la funzione printArray nel tuo programma da GDB.

3

Questa è un'estensione più utile dell'ultimo post. Inoltre è possibile utilizzare: stampa var @ cols @ filari

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

Puoi farlo ?:

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) 

Funziona in lldb - non l'ho provato in gdb. Sembra molto più facile.