1

私は正常に動作する C プログラムを持っていますが、約 1 週間実行すると、常に segfault のように見えます。-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
4

2 に答える 2

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

上記の 2 つのステートメントは間違っています。次のように変更します。

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

見るfprintf()

@ Basile Starynkevitch からのコメント、追加。

fputs()とを使用することもできますfputc()。これらはよりシンプルで効率的です。

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