delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

14 Feb 2009

一个问题请教WxWidget高手

WxClassInfo的析构函数(~WxClassInfo)死循环是什么原因?检查发现RTTI的那个链表有个环,但是不太明白这个表(从上下文看是由Register()方法维护的)为什么能出现环?

具体的案例是 MadEdit (FreeBSD port) 退出时,由于 exit() 会调用 atexit() 定义的钩子,后者调用 WxClassInfo 的析构函数,并在此时陷入死循环。


Archived: 6 Comments

d4m* | February 14, 2009 11:13 AM

帮顶。。。
另:您老的MB上面会不会出现关不了机的情况,以及wireless是不是正常?

Captcha: fu34g5

Henry Hu | February 14, 2009 7:37 PM

装了个madedit,还真的停在那个地方了……

Henry Hu | February 16, 2009 1:18 PM

经过grep,这个表,是在wxClassInfo的构造器里面维护的,在object.h里面……
我这里出问题的是,wxRichTextHeaderFooterData类wxClassInfo的m_next是
wxPseudoTransparentFrame类的wxClassInfo,而这个前面出现过了……
难道类名太长出的问题么………………

Henry Hu | February 16, 2009 2:43 PM

终于找出来了…… 是madedit的问题……
madedit里面有个目录叫wxAUI。应该是wxWidgets的一个扩展。
但是wxWidgets现在已经自带wxAUI了。
根据http://wiki.wxwidgets.org/WxAUI
As of wxWidgets 2.8.0, wxAUI is distributed with wxWidgets.
但是madedit还是把自带的wxAUI加入了编译。
madedit的那个wxAUI先初始化(静态成员构造),建了个表。
wxWidgets那个后初始化。
wxWidgets里面那些wxAUI的类在IMPLEMENT_(DYNAMIC_)CLASS宏的时候,初始化一个静态的ms_classInfo成员。
这个成员把自己加入链表里面…… 结果链表里面就有两个m_className是wxAuiMDIParentFrame的wxClassInfo对象……
这样下去肯定会出问题……

Henry Hu | February 16, 2009 3:09 PM

把这个存为patch-啥的,放files下面就能成……
但是只有wxWidgets 2.8才要这个patch,2.6不需要…… 所以还是麻烦……
另外,madedit出了0.2.9了,昨天出的,还没试过……

— ./Makefile.in.orig 2009-02-16 15:02:44.000000000 +0800
+++ ./Makefile.in 2009-02-16 15:03:26.000000000 +0800
@@ -76,9 +76,7 @@
madedit-MadEditSearch.$(OBJEXT) madedit-MadEdit_gtk.$(OBJEXT) \
madedit-MadEncoding.$(OBJEXT) madedit-MadLines.$(OBJEXT) \
madedit-MadSyntax.$(OBJEXT) madedit-MadUndo.$(OBJEXT) \

  • madedit-TradSimp.$(OBJEXT) madedit-auibook.$(OBJEXT) \
  • madedit-dockart.$(OBJEXT) madedit-floatpane.$(OBJEXT) \
  • madedit-framemanager.$(OBJEXT) madedit-tabmdi.$(OBJEXT) \
  • madedit-TradSimp.$(OBJEXT) \
    madedit-CharDistribution.$(OBJEXT) madedit-JpCntx.$(OBJEXT) \
    madedit-LangBulgarianModel.$(OBJEXT) \
    madedit-LangCyrillicModel.$(OBJEXT) \
    @@ -296,7 +294,7 @@
    sysconfdir = @sysconfdir@
    target_alias = @target_alias@
    SUBDIRS = syntax po
    -INCLUDES = -I$(top_srcdir)/wxAUI/include -I$(top_srcdir)/charset-detector/include -I$(top_srcdir)/charset-detector/src -I$(top_srcdir)/charset-detector/src/tables
    +INCLUDES = -I$(top_srcdir)/charset-detector/include -I$(top_srcdir)/charset-detector/src -I$(top_srcdir)/charset-detector/src/tables
    madedit_CXXFLAGS = -DwxUSE_AUI=1 -DWXDLLIMPEXP_AUI= -DWXDLLIMPEXP_FWD_AUI= -DDATA_DIR=\"${datadir}\" $(glib_gtk2_CFLAGS)
    madedit_SOURCES = src/MadAboutDialog.cpp \
    src/MadAboutDialog.h \
    @@ -351,17 +349,6 @@
    src/MadEdit/TradSimp.cpp \
    src/MadEdit/TradSimp.h \
    src/MadEdit/ucs4_t.h \
  • wxAUI/include/wx/aui/aui.h \
  • wxAUI/include/wx/aui/auibook.h \
  • wxAUI/include/wx/aui/dockart.h \
  • wxAUI/include/wx/aui/floatpane.h \
  • wxAUI/include/wx/aui/framemanager.h \
  • wxAUI/include/wx/aui/tabmdi.h \
  • wxAUI/src/auibook.cpp \
  • wxAUI/src/dockart.cpp \
  • wxAUI/src/floatpane.cpp \
  • wxAUI/src/framemanager.cpp \
  • wxAUI/src/tabmdi.cpp \
    charset-detector/src/CharDistribution.cpp \
    charset-detector/src/CharDistribution.h \
    charset-detector/src/JpCntx.cpp \

Xin LI replied to comment from Henry Hu | February 18, 2009 2:27 AM

谢谢!现在已经把madedit升级到0.2.9了。