GDB question: Pretty-Printing a 2D Array?

前端 未结 5 531
温柔的废话
温柔的废话 2020-12-14 22:11

I have a 2d array matrix[10][10] that I\'d like to inspect at debug time.

I understand that I can do this in GDB using

p *matrix@10

5条回答
  •  庸人自扰
    2020-12-14 23:04

    You could always define a function in GDB to do the same thing. If you had the following c code:

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

    You could then define the following GDB function (or something similar to it):

    (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
    

    which would result in the following 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) 
    

    You could just as easily use nested while loops in your GDB function. And, as noted in a previous answer you can always just call the printArray function in your program from within GDB.

提交回复
热议问题