使用TCL_MEM_DEBUG编译时,应用程序崩溃

问题描述 投票:0回答:1

在TCL 8.6.9上,我尝试使用TCL_MEM_DEBUG来帮助诊断应用程序中的内存泄漏,但是在使用/启用它时发生崩溃。

相同的代码在没有TCL的情况下编译时运行良好,但是在使用该标志时崩溃。

[调用函数“ Tcl_ResetResult-> ResetObjResult-> Tcl_IsShared(在调试中为Tcl_DbIsShared)”时,TCL中的代码崩溃。

在执行“ Tcl_Eval()”时发生。

(这是具有多个线程(解释器)的应用程序。

谢谢

更多一点信息:这在DLL中创建的线程中发生。因此,当从TCL加载DLL时,我们在这里做什么,我们创建了一个新的TCL解释器(Tcl_CreateInterp),然后在其中使用该解释器的地方创建了一个新线程。其他线程(带有自己的解释器)将命令发送到执行它们的那个线程。这是发生此崩溃的时间。

windows tcl
1个回答
0
投票
尚未创建任何对象本身,则该情况确实会在用TCL_MEM_DEBUG编译的tcl中发生这种情况。实际上,对象表是在函数TclDbInitNewObj中的其TSD中为每个线程创建的(因此,如果第一个对象要在线程中创建,则按需创建)...

因此,我猜想在线程Th1中创建了一些obj并将其提供给线程Th2,但是线程Th2仍然没有创建任何对象。通常,它永远不会发生,因为在线程自身中创建了解释器(并且在初始化阶段将创建多个对象)。刚才您确实在上面写过:

我们创建一个新的TCL解释器(Tcl_CreateInterp),然后在使用该解释器的地方创建一个新线程。

尽管我根本不认为这是个好主意(线程存储等方面的过度工作,但我认为这可能是我们这方面的意外行为,如果可以的话,我们应该予以解决。

只要它仍然不固定,解决方法只是在与您的应用程序中的tcl对象一起工作的每个线程中

创建1个空对象

,如下所示:

#ifdef TCL_MEM_DEBUG if (1) { Tcl_Obj *objPtr = Tcl_NewObj(); Tcl_DecrRefCount(objPtr); }; #endif

© www.soinside.com 2019 - 2024. All rights reserved.