如何获取gdb调用命令识别函数返回中的新行

时间:2017-06-17 16:53:55

标签: gdb

我有以下内容:

$ 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 "abc\ndef\n"

您可以看到未提取换行符。

我正在使用这个技巧解决它:

(gdb) call printf("%s", foo())
abc
def
$5 = 8

它有效,但有点麻烦。我想知道是否有更简洁的方式?

如果在这里调用printf是最好的解决方案,有没有办法告诉gdb不要显示“$ 5 = 8”?

1 个答案:

答案 0 :(得分:0)

  

您可以看到未提取换行符。

相反,您可以在缓冲区中看到两个换行符(如预期的那样) - 这就是std::vector<bool>的含义。

  

我想知道是否有更简洁的方式?

简洁的方式是GDB已经实现的方式。您似乎想要详细方式。尝试:

\n

(注意:这与您已尝试过的(gdb) printf "%s", foo() 非常不同。)