>我有以下内容:
$ cat 1.c
#include <stdio.h>
static char buf[1000];
const char*
foo(void)
{
memcpy(buf, "abc", 3);
buf[3] = 'n';
memcpy(buf+ 4, "def", 3);
buf[7] = 'n';
buf[8] = 0;
return buf;
}
int main()
{
foo();
printf("%s", buf);
return 0;
}
我编译它:gcc -g -O0 1.c
并启动 gdb:gdb ./a.out
我在"printf"行设置断点,然后发出调用命令:
(gdb) call foo()
$4 = 0x600980 "abcndefn"
您可以看到没有选取换行符字符。
我正在使用这个技巧来解决它:
(gdb) call printf("%s", foo())
abc
def
$5 = 8
它有效,但有点麻烦。我想知道是否有更简洁的方法?
如果调用 printf 是这里最好的解决方案,有没有办法告诉 gdb 不要显示"$5 = 8"?
您可以看到没有选取换行符字符。
相反,您可以在缓冲区中看到两个换行符(如预期的那样)——这就是n
的意思。
我想知道是否有更简洁的方法?
简洁的方式是GDB已经实现的。你似乎想要冗长的方式。尝试:
(gdb) printf "%s", foo()
(注意:这与你已经尝试过的call printf
非常不同。