GDB 打印 char 数组中的所有值

GDB print all values in char array

我正在我的数组中存储各种文件名,这些文件名由空字节分区。调试时,我只能看到第一个文件名。因此,例如,如果我的数组是这样的:hello.txt00000hello2.txt,我只能看到 hello.txt。如何打印整个阵列?我在别处找不到这样的命令。

您可以尝试将数组定义为:

char ** array;

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

那么代码可以

memset( array[x], '[=11=]', NUM_COLUMNS );
strncpy(array[x], myString, NUM_COLUMNS-1);

其中 myString 是放置在该行中的数据 和

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] );
    }
}

然后对数组中的每一行使用 'p array[x]'

您可以使用 x/999bc,其中 999 是数组的大小,例如:

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[=10=]world[=10=]hahaha";
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
 = 0x40056c "hello"
(gdb) x/19bc p
0x40056c:   104 'h' 101 'e' 108 'l' 108 'l' 111 'o' 0 '[=10=]0'    119 'w' 111 'o'
0x400574:   114 'r' 108 'l' 100 'd' 0 '[=10=]0'    104 'h' 97 'a'  104 'h' 97 'a'
0x40057c:   104 'h' 97 'a'  0 '[=10=]0'
(gdb) 

使用gdb,您可以使用以下命令打印数组元素:

(gdb) print *array@size

如果我的变量 array 是一个类型 char*[] 如下

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

然后我可以显示数组的前 2 个 char* 条目:

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

用它来显示程序的参数非常方便:

(gdb) print *argv@argc

也可以使用 x/Ns *argvx 命令执行相同的操作,其中 Nargc(即对于 argc = 2,x/2s *argv)

打印命令的整个魔法的文档是 here

如果您有一个 fixed-length 数组并想查看其中的所有数据 - 只需打印该数组,您将获得完整的输出,因为 GDB 知道其大小。
如果你有一个指向 fixed-length 数组的指针,那么 GDB 会假设最常见的情况——一个 C 字符串,所以它会在第一个十六进制 null 处停止显示。要查看更多信息:de-reference 并将结果转换为具有您想要查看的预期长度的字符数组。

#include <stdio.h>
static char myarr[55] = "hello.txt\x00\x00\x00\x000hello2.txt";

int main () {
   char *p = myarr;
   puts (p);
   return 0;
}

编译并且 运行 为 gcc -g test.c && gdb -q -ex start ./a.out:

Reading symbols from /tmp/a.out...done.
Temporary breakpoint 1 at 0x400535: file test.c, line 5.
Starting program: /tmp/a.out

Temporary breakpoint 1, main () at test.c:5
5          char *p = myarr;
(gdb) step
6          puts (p);
(gdb) print p
 = 0x601060 <myarr> "hello.txt"
(gdb) print *p
 = 104 'h'
(gdb) print (char[20])*p
 = "hello.txt[=11=]0[=11=]0[=11=]0[=11=]0hello2."
(gdb) print (char[55])*p
 = "hello.txt[=11=]0[=11=]0[=11=]0[=11=]0hello2.txt", '[=11=]0' <repeats 31 times>
(gdb) detach
Detaching from program: /tmp/a.out, process 456
hello.txt
(gdb) quit

如果您希望以十六进制而不是八进制打印序列 - 请查看 54469844