我有一个运行良好的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;
}

有人看到上面两个功能有什么问题吗?
如果有帮助,这里有一条线索:
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

最佳答案

 fprintf(fp, debug_info);

是错误的,如果debug_info包含%(后面跟一些字符,例如s),则是不正确的(可能undefined behavior)。
您应该读取fprintf(3),启用交叉编译器中的所有警告,例如,使用传递给交叉编译器的-Wall -g进行编译(clang会警告您,gcc应该至少使用-Wextra进行编译,但可能不会)。在您的情况下,您可以简单地用一个更简单、更快的fputs(3)调用来替换故障的fprintf,例如:
fputs(debug_info, fp);

(在emebed应用程序中,fputs通常值得使用,因为它比fprintf快;实际上有时编译器会将fprintf优化为更简单的东西。)
并用一个简单的fprintf(fp, "\n");替换putc('\n', fp);
顺便说一句,config_debug既是全局变量又是参数,这很令人困惑。避免名称串通以提高可读性。确保config_debugdebug_info是以空结尾的字符串。

关于c - 运行一周后发生段故障?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19280512/

10-13 03:33