试图递减在另一个线程中分配的Tcl_Obj的引用计数

时间:2019-05-15 17:36:12

标签: tcl

我编译了sourceforge tcl可执行文件,它通过了提供的所有测试,并且运行时与在下载的可执行文件8.6.9中看到的相同的段错误。我在AMD处理器上的Ubuntu 16.04(出于传统原因)上运行。 (我已经在笔记本电脑上的ubuntu 18.04上运行,它也有同样的故障。)

因此,接下来,我重新编译为“ --enable-symbols = mem”,以查看是否有内存泄漏导致了segfault,现在它立即失败,并显示:

Trying to decr ref count of Tcl_Obj allocated in another thread
./runMeg.sh: line 3: 29972 Aborted (core dumped) ../source/main_megatron.

对于此响应该怎么办,我没有看到任何答案,有人可以建议我需要解决什么吗?

我所有的线程都具有以下形式:

set graphDisplayThread [ thread::create {
  after [expr {int(1000) }]
  .....
  puts "...Initialized graphDisplayUpdate_02 ID $c update."
  thread::wait
  }]

和:

thread::send  $::graphDisplayThread { 
   incr b
   graphDisplayUpdate .c 
   }       

在捕获互斥锁之后并通过TSV变量引用所有共享变量。应用程序中有5个线程,根本没有C代码。总共约2000行代码。

该应用程序运行数千个周期,然后使用以前的ActiveState 8.6.9预编译版本在随机点进行段错误。因此,作为第一步,我现在尝试使用已编译的SourceForge 8.6.9内存检查来隔离故障点,但是上面的问题是我遇到的第一个问题,并且在启动后立即发生。

更新(美国东部时间19年5月16日8:28):用于回答以下注释的新详细信息。...此应用程序中没有C代码,并且Tcl_Obj错误仅出现在基于sourceForge的8.6中。 9个编译(2)我自己完成,而不是ActiveState 8.6.9的预构建下载。我串联并测试的双“ MEM_DEBUG”和NO-“ MEM_DEBUG”构建中均发生sourceForge代码中的错误。两者都通过了所有安装测试。

总结:

sourceForge 8.6.9 compile w/MEM_DEBUG option:   Tcl_Obj Abort error 
sourceForge 8.6.9 compile w/o MEM_DEBUG option: Tcl_Obj Abort error
ActiveState 8.6.9 build:                    does not Abort, random seg fault   

为什么我应该信任我自己创建的sourceForge构建,而不是不显示问题的ActiveState预先构建的可执行文件?而且,如果我们确实相信sourceForge编译版本,那么我该如何隔离有问题的TCL代码在何处创建TclObject错误?

更新5/16/19 @ 13:34EST:在Ubuntu 18.04上,ActiveState 8.6.9出现相同的段错误。尚未检查我的SourceForge版本,以了解它们的行为。

1 个答案:

答案 0 :(得分:0)

通过有条不紊地修改代码块并观察Tcl_Obj错误是否消失,我发现了2个错误:

  • 我已经多次声明了互斥量和cond变量。现在,它只声明一次,并在所有其他地方引用。
  • 在我不再想要的地方发现了一个残留代码,用于删除TSV。

这也修复了段错误。

感谢所有帮助和提示,mrcalvin。