Segfault在运行一周后出现?

时间:2013-10-09 19:07:33

标签: c raspberry-pi

我有一个运行良好的C程序,但经过大约一周的运行后,似乎总是会出现段错误。我用-g编译它并通过gdb运行它看起来像是指向下面的代码。

在我的主循环中,我调用一个函数(实际上是为了尝试调试崩溃的原因)

char config_debug[10];

然后我读了一个conf文件并根据其中的当前设置,将config_debug设置为true

然后在我的程序中我称之为:

(第312行):

  debug("send off data",config_debug);

这是功能:

int debug(char *debug_info, char *config_debug)
{
    chomp(config_debug);
    if ( strcmp(config_debug,"true") == 0 )
            {
            FILE *fp;
            fp=fopen("/tmp/debug.log", "a");

(第55行):

            fprintf(fp, debug_info);
            fprintf(fp, "\n");
            fclose(fp);
            }
    return 0;
}  

void chomp(char *s) {
    while(*s && *s != '\n' && *s != '\r') s++;
    *s = 0;
}

任何人都可以看到上述2个功能有什么问题吗?

如果它有帮助,这是一个跟踪:

Program terminated with signal 11, Segmentation fault.
#0  0xb6d7a67c in vfprintf () from /lib/arm-linux-gnueabihf/libc.so.6 (gdb) bt
#0  0xb6d7a67c in vfprintf () from /lib/arm-linux-gnueabihf/libc.so.6
#1  0xb6d83cd8 in fprintf () from /lib/arm-linux-gnueabihf/libc.so.6
#2  0x0000a848 in debug (debug_info=0xc304 "send off data", config_debug=0xbec0cb5c "true") at station.c:55
#3  0x0000b614 in main (argc=1, argv=0xbec0cd94) at station.c:312

2 个答案:

答案 0 :(得分:2)

 fprintf(fp, debug_info);
如果debug_info包含%(后跟一些字符,例如s),则

错误且不正确(可能undefined behavior)。

您应该阅读fprintf(3),在交叉编译器中启用所有警告,例如通过编译传递给你的交叉编译器的-Wall -gclang会警告你和gcc应该,至少-Wextra,但可能没有。在您的情况下,您可以通过更简单快捷的fputs(3)调用来替换那个有问题的fprintf,例如:

fputs(debug_info, fp);

(在emebedded应用程序中,fputs通常值得使用,因为它比fprintf更快;实际上有时编译器会将fprintf优化为更简单的东西。)

并将fprintf(fp, "\n");替换为简单的putc('\n', fp);

BTW,让config_debug既是全局变量又是参数是令人困惑的。避免名称共谋以提高可读性。请确保config_debugdebug_info为空终止字符串。

答案 1 :(得分:2)

 fprintf(fp, debug_info);
            fprintf(fp, "\n");  

以上两个陈述都是错误的。修改像这样

 fprintf(fp,"%s", debug_info); 
            fprintf(fp,"%s", "\n");

请参阅fprintf()

来自@ Basile Starynkevitch评论,补充说。

您还可以使用fputs()fputc()这些更简单,更高效。

 fputs(debug_info,fp); 
 fputc('\n',fp);