我编译了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版本,以了解它们的行为。
答案 0 :(得分:0)
通过有条不紊地修改代码块并观察Tcl_Obj错误是否消失,我发现了2个错误:
这也修复了段错误。
感谢所有帮助和提示,mrcalvin。