wishel 发表于 2008-10-14 11:10:41

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

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


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

wishel 发表于 2008-10-14 11:43:08

我的程序中log是同时输出到stdout和一个文件里的,很多地方都有这样的打印调试log的语句。是不是这样不稳定?现在把LM_DEBUG的级别关掉了,只留了LM_ERROR,暂时没问题了。

winston 发表于 2008-10-14 14:01:21

肯定是程序的bug。我在比较复杂的线程环境中用过ACE LOG框架,没有问题的。不会出错。

wishel 发表于 2008-10-17 14:31:34

可能是我的程序哪里跟log有冲突。以前都挺好的后来怎么出问题了:L
现在只能把log关了。不然不知道什么时候就会突然崩溃。。。

wishel 发表于 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 发表于 2008-11-9 17:36:33

在这里有牛人发现了ACE的ACE_Logging_Strategy类中的一个多线程安全问题

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

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

[ 本帖最后由 wishel 于 2008-11-9 17:45 编辑 ]

newzai 发表于 2008-11-22 20:52:07

ACE_DEBUG是线程安全的,如果在我们的ACE应用程序中是多线程的话,那么每一个线程所应用的ACE_Log_Msg对象是不一样。
ACE_Log_Msg 是每一个线程的专有数据。
ACE_DEBUG 默认是输出在 STDERR的,如果你要把自己的LOG信息输出到OSTREAM或者CALLBACK等。
需要在每一个线程都重新定位。
页: [1]
查看完整版本: 奇怪的问题。ACE_DEBUG导致程序崩溃