1

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

2 回答 2

2
 fprintf(fp, debug_info);

是错误的,并且不正确(可能是未定义的行为)如果debug_info包含 a %(后跟一些字符s,例如)。

您应该阅读fprintf(3),启用交叉编译器中的所有警告,例如通过编译-Wall -g传递给您的交叉编译器(clang会警告您并且gcc应该,至少 with -Wextra,但可能不会)。fprintf在您的情况下,您可以简单地用更简单、更快的fputs(3)调用替换该错误,例如:

fputs(debug_info, fp);

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

fprintf(fp, "\n");用一个简单的替换putc('\n', fp);

顺便说一句,config_debug既是全局变量又是参数是令人困惑的。避免名称串通以提高可读性。确保config_debuganddebug_info是以空字符结尾的字符串。

于 2013-10-09T19:10:04.013 回答
2
 fprintf(fp, debug_info);
            fprintf(fp, "\n");  

上面两个说法是错误的,修改成这样

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

fprintf()

来自@Basile Starynkevitch 评论,添加。

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

 fputs(debug_info,fp); 
 fputc('\n',fp);
于 2013-10-09T19:12:17.463 回答