我试图用perl运行一个程序来打印" A"通过gdb 512次。它返回代码04.我开始慢慢下降到511然后510等等。但它仍然以代码04返回。这是它应该是怎样的?如果没有,我做错了什么?谢谢你的回答。
代码:
#include <stdio.h>
int main(int argc, char * argv[])
{
char buf[256];
if(argc == 1)
{
printf("Usage: %s input\n", argv[0]);
exit(0);
}
strcpy(buf,argv[1]);
printf("%s", buf);
}
我正在从gdb运行:
run perl -e 'print "A" x 512'
答案 0 :(得分:1)
没有理由让perl或gdb参与其中。
从1989/1990 C标准开始,到达}
末尾的main
会向环境返回未定义的状态。 (在您的情况下,4
的实际状态可能 printf
返回的值,即打印的字符数。调用程序的方式为{{ 1}}指向字符串argv[0]
,长度为4个字符。但你绝对不应指望这种行为。)
1999年标准引入了一条新规则(受C ++启发):到"perl"
的末尾相当于main
。但是gcc默认使用C90标准加上GNU扩展(相当于return 0;
)。
在-std=gnu90
函数的末尾添加return 0;
和/或使用指定更高标准的选项编译C程序,例如main
(或{{1}如果你想使用GNU特定的扩展名。)
最后,看起来你试图打印512 -std=c99
个字符,但是你用参数调用你的程序:
-std=gnu99
这是三个参数,你的程序会忽略除第一个,4个字符的字符串'A'
以外的所有参数。剩下的参数意味着传递给Perl解释器,但是你没有调用Perl解释器。
执行此操作的一种正确方法是:
perl -e 'print "A" x 512'
其中"perl"
是您的计划的名称。但这会导致未定义的行为(可能是程序崩溃,或者如果你运气不好,它可能看似“工作”),因为你将./foo $(perl -e 'print "A" x 512')
指向的字符串复制成只有256个字符的数组。对于这个简单的程序,可以通过不复制字符串来轻松避免。
并且您的程序的输出不会以换行符结束,这可能会导致问题。在类UNIX系统上,程序的输出可能会打印在与下一个shell提示符相同的行上 - 或者输出可能根本不可见。
要查看程序的退出状态,请键入:
foo
(这假设您正在使用bash或类似的shell。)
答案 1 :(得分:0)
我明白你要做什么。 Keith对于gdb如何解释参数的解释是正确的。但是,解决方案非常简单。你可以保持一切相同,除非你需要用符号包围perl代码。这将确保执行perl代码并将正确的参数发送到您的代码中。享受充满乐趣的缓冲。
试试这个。
run `perl -e 'print "A" x 512'`
另外,确保在您的计算机上安装了perl ...