我在数组中存储各种文件名,这些文件名由空字节分区。调试时,我只能看到第一个文件名。因此,例如,如果我的数组是这样的:
hello.txt00000hello2.txt
,我只能看到hello.txt
。如何打印整个数组?我在其他地方找不到这样的命令。
您可以使用
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\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)
使用 gdb,您可以使用以下命令打印数组的元素:
(gdb) print *array@size
如果我的变量array是类型
char*[]
,如下所示
const char *array[] = {"first","second","third"};
然后我可以使用以下方法显示数组的前 2 个
char*
条目:
(gdb) print *array@2
$2 = { 0x..... "first", 0x..... "second"}
使用它来显示程序的参数非常方便:
(gdb) print *argv@argc
也可以使用 x/Ns *argv
对
x命令执行相同的操作,其中 N 是 argc 的整数值(即 argc = 2, x/2s *argv)
打印命令的整个魔力的文档位于这里。
如果您有一个固定长度的数组并且想要查看其中的所有数据 - 只需要求打印该数组,您就会获得完整的输出,因为 GDB 知道其大小。
如果您有一个指向固定长度数组的指针,则 GDB 会采用最常见的情况 - C 字符串,因此它会在第一个十六进制空值处停止显示。要查看更多信息:取消引用并将结果转换为具有您想要查看的预期长度的 char 数组。
#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
$1 = 0x601060 <myarr> "hello.txt"
(gdb) print *p
$2 = 104 'h'
(gdb) print (char[20])*p
$3 = "hello.txt\000\000\000\000hello2."
(gdb) print (char[55])*p
$4 = "hello.txt\000\000\000\000hello2.txt", '\000' <repeats 31 times>
(gdb) detach
Detaching from program: /tmp/a.out, process 456
hello.txt
(gdb) quit
如果您希望以十六进制而不是八进制打印序列 - 请查看54469844。
您可以尝试将数组定义为:
char ** array;
array = malloc( NUM_ROWS*sizeof char* );
for( int i =0; i < NUM_ROWS; i++ )
{
*array[i] = malloc( NUM_COLUMNS )
}
然后代码就可以了
memset( array[x], '\0', 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/10bs array@10
x/10bc array@10