贝贝花花包包店,精品555皮具,钱夹,皮夹

字体:  

奇怪的问题。ACE_DEBUG导致程序崩溃

wishel 发表于: 2008-10-14 11:10 来源: ACE 开发者

第二次遇到这种情况了,可能ace的log框架有些问题。以前还遇到过一条语句输出多个变量内容的时候顺序会错乱的问题。
崩溃的很奇怪,程序中有一行:
    ACE_DEBUG ((LM_DEBUG, "xxxxxx\n"));


注掉就好了。单线程运行的时候也会挂。

最新回复

wishel at 2008-10-14 11:43:08
我的程序中log是同时输出到stdout和一个文件里的,很多地方都有这样的打印调试log的语句。是不是这样不稳定?现在把LM_DEBUG的级别关掉了,只留了LM_ERROR,暂时没问题了。
winston at 2008-10-14 14:01:21
肯定是程序的bug。我在比较复杂的线程环境中用过ACE LOG框架,没有问题的。不会出错。
wishel at 2008-10-17 14:31:34
可能是我的程序哪里跟log有冲突。以前都挺好的后来怎么出问题了
现在只能把log关了。不然不知道什么时候就会突然崩溃。。。
wishel at 2008-10-22 17:20:02
现在把log的定向到stderr关了:
ACE_LOG_MSG->clr_flags (ACE_Log_Msg::STDERR);
只留下输出到文件的部分:
ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM);
运行了一段时间暂时没发现问题。
wishel at 2008-11-09 17:36:33
在这里有牛人发现了ACE的ACE_Logging_Strategy类中的一个多线程安全问题

http://blog.tom.com/blogger2007/article/1296.html

可惜最后没说怎么解决的。看起来比较复杂。。一时看不动,有空再慢慢理解吧

[ 本帖最后由 wishel 于 2008-11-9 17:45 编辑 ]
newzai at 2008-11-22 20:52:07
ACE_DEBUG是线程安全的,如果在我们的ACE应用程序中是多线程的话,那么每一个线程所应用的ACE_Log_Msg对象是不一样。
ACE_Log_Msg 是每一个线程的专有数据。
ACE_DEBUG 默认是输出在 STDERR的,如果你要把自己的LOG信息输出到OSTREAM或者CALLBACK等。
需要在每一个线程都重新定位。