我有一个用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
发生了什么。这是一个相当大的计划。我只对这个特定的函数调用感兴趣,我想忽略其他所有内容。
我应该注意,我没有编译代码的环境。我所拥有的只是二进制文件。
答案 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) = ?