使用gdb检查被调用程序返回的输出和错误消息的过程

时间:2017-11-01 16:54:18

标签: gdb

我有一个用C ++编写的程序,它的功能类似于:

std::string cmd = "curl -s http://x.x.x.x/latest/meta-data/public-hostname";
std::vector<std::string> output;
runCmd(cmd, output);

如果curl命令失败,程序会默默地忽略它。我需要能够检查程序到达这一点时发生了什么:我想查看curl生成的输出,包括错误消息和返回代码。

如何使用gdb执行此操作?请引导我完成使用gdb运行程序的步骤,以便我可以看到curl发生了什么。这是一个相当大的计划。我只对这个特定的函数调用感兴趣,我想忽略其他所有内容。

我应该注意,我没有编译代码的环境。我所拥有的只是二进制文件。

2 个答案:

答案 0 :(得分:0)

不确定gdb会在您生成子进程时对您有多大帮助。 我建议将代码更改为

std::string cmd = "curl -s http://x.x.x.x/latest/meta-data/public-hostname 2>/tmp/error | tee /tmp/output";

这样/ tmp / erro和/ tmp / output就会给你发生的事情;

编辑: 因为编译不可能,你可以使用这个技巧: 创建一个名为curl的脚本,其中包含:

#!/bin/bash
/usr/bin/curl $@ 2>/tmp/error | tee /tmp/output

(不要忘记将权限更改为+ x)

然后,在执行程序时,只需执行以下操作:

PATH=.:$PATH ./yout_binary

假设你的脚本在。

然后程序将使用你的假冒&#39;卷曲

答案 1 :(得分:0)

我会将strace用于此任务,而不是gdb:

strace -f -s 1024 -o log ./program

此处-f也意味着跟踪子进程。您需要它,因为这行代码runCmd(cmd, output);很可能fork()运行子进程。

-s 1024指定要打印的最大字符串大小。默认情况下,32通常太短。

将输出保存到log文件后,您应该轻松地在其中找到类似curl -s的内容。这是子进程启动的地方。您可以在write(2, "...write(1, "...等行中查看它写入stderr或stdout的内容。在流程执行结束时,您将看到它的退出代码,例如1退出代码:

exit_group(1)                           = ?