GDB print all values in char array

you might try defining the array as:

char ** array;

array = malloc( NUM_ROWS*sizeof char* );
for( int i =0; i < NUM_ROWS; i++ )
{
    *array[i] = malloc( NUM_COLUMNS )
} 

then the code can

memset( array[x], '\0', NUM_COLUMNS );
strncpy(array[x], myString, NUM_COLUMNS-1);

where myString is the data to place in that row and

for( int i = 0; i < NUM_ROWS; i++ )
{
    if( array[i] )
    { // only enters this code block if something placed in row
        printf( "%s\n", array[x] );
    }
}

then use 'p array[x]' for each row in the array


You can use x/999bc, where 999 is the size of your array, for instance:

paul@thoth:~/src/sandbox$ gdb ./str
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/paul/src/sandbox/str...done.
(gdb) list
1   int main(void) {
2       char * p = "hello\0world\0hahaha";
3       return 0;
4   }
5   
(gdb) b 3
Breakpoint 1 at 0x4004b8: file str.c, line 3.
(gdb) run
Starting program: /home/paul/src/sandbox/str 

Breakpoint 1, main () at str.c:3
3       return 0;
(gdb) print p
$1 = 0x40056c "hello"
(gdb) x/19bc p
0x40056c:   104 'h' 101 'e' 108 'l' 108 'l' 111 'o' 0 '\000'    119 'w' 111 'o'
0x400574:   114 'r' 108 'l' 100 'd' 0 '\000'    104 'h' 97 'a'  104 'h' 97 'a'
0x40057c:   104 'h' 97 'a'  0 '\000'
(gdb) 

With gdb, you can achieve to print the elements of your array using the following command:

(gdb) print *array@size

If my variable array is a type char*[] such as below

const char *array[] = {"first","second","third"};

Then I could display the 2 first char* entries of my array by using:

(gdb) print *array@2
$2 = { 0x..... "first", 0x..... "second"}

Using it in order to display the arguments of a program is very handy:

(gdb) print *argv@argc

It's also possible to do the same with x commands using x/Ns *argv, where N is the integer value of argc (i.e. for argc = 2, x/2s *argv)

The documentation for the whole magic of the print command is here.

Tags:

C

Gdb