1

我有这种非常奇怪的行为:

在下面的代码中:如果我评论对 MyLogger 的调用,那么一切正常,即我得到了 sTempNr 标记并打印了 4 个标记。但是,如果我取消注释对 MyLogger 进行日志记录的调用,那么只会发生一次迭代,并且在具有如下类似代码的其他测试类中,会发生 4 次以上的循环,并将冗余信息发送到 MyLogger。

因此,我使用 Purify 工具检查了 MyLogger 中是否存在一些内存问题。找不到。MyLogger 正在使用 vaargs 来提取 args 和 vfprintf 调用来打印。

我不确定如何进一步调试此代码。任何指导将不胜感激!。

char sTempNr[41] = "1129Z13589.2.9.10";
char *sTempStr;
sTempStr = NULL;

sTempStr = strtok(sTempNr,".");
while (sTempStr)
{
     printf("in in TempStr[%s]\n",sTempStr);
      //MyLogger("write","","Temp String[%s]",sTempStr);

     sTempStr = strtok(NULL,".");
}
4

4 回答 4

11

strtok()在内部保留一些静态数据,因此可能直接或间接MyLogger调用。strtok()

替换strtok()strtok_r()(reentrant version of strtok()) 来解决这个问题。

于 2009-08-14T14:00:07.403 回答
1

记录器是否在调用 strtok?

于 2009-08-14T13:59:38.200 回答
1

MyLogger 也使用 strtok 吗?请注意,strtok 不是无状态的。

于 2009-08-14T14:00:30.680 回答
-1

听起来 MyLogger 正在破坏 sTempStr 中的字符串。调用 MyLogger 后再次尝试打印。例如

 printf("in in TempStr[%s]\n",sTempStr);
 MyLogger("write","","Temp String[%s]",sTempStr);
 printf("in in TempStr[%s]\n",sTempStr);

看看有没有什么变化

于 2009-08-14T14:03:01.380 回答