我有一个运行良好的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_debug
和debug_info
是以空结尾的字符串。关于c - 运行一周后发生段故障?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19280512/