程序已退出,错误代码为04

时间:2014-12-27 00:06:21

标签: perl gdb

我试图用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'

2 个答案:

答案 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 ...