我有一个运行良好的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
答案 0 :(得分:2)
fprintf(fp, debug_info);
如果debug_info
包含%
(后跟一些字符,例如s
),则错误且不正确(可能undefined behavior)。
您应该阅读fprintf(3),在交叉编译器中启用所有警告,例如通过编译传递给你的交叉编译器的-Wall -g
(clang
会警告你和gcc
应该,至少-Wextra
,但可能没有。在您的情况下,您可以通过更简单快捷的fputs(3)调用来替换那个有问题的fprintf
,例如:
fputs(debug_info, fp);
(在emebedded应用程序中,fputs
通常值得使用,因为它比fprintf
更快;实际上有时编译器会将fprintf
优化为更简单的东西。)
并将fprintf(fp, "\n");
替换为简单的putc('\n', fp);
BTW,让config_debug
既是全局变量又是参数是令人困惑的。避免名称共谋以提高可读性。请确保config_debug
和debug_info
为空终止字符串。
答案 1 :(得分:2)