我编译了sourceforge tcl可执行文件,它通过了提供的所有测试,并且运行时使用的段错误与我在下载的可执行文件8.6.9中看到的段错误相同。我在AMD处理器上运行Ubuntu16.04(出于遗留原因)。(我在我的笔记本电脑上运行了ubuntu 18.04,它也有同样的故障。)
因此,接下来我重新编译并打开了"--enable-symbols=mem“,以查看是否是内存泄漏导致了段故障,现在它立即失败了,并显示:
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内存检查来隔离故障点,作为第一步,但上面的问题是我遇到的第一个问题-它在启动后立即发生。
更新(5/16/19 8:28 EST):回答以下评论的新详细信息...这个应用程序中没有C代码,并且Tcl_Obj错误只出现在基于sourceForge的8.6.9编译中(2)我自己做的,而不是ActiveState 8.6.9预建下载。sourceForge代码中的错误出现在我同时创建并测试的两个"MEM_DEBUG“和非”MEM_DEBUG“构建中。两者都通过了所有安装测试。
总结一下:
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编译后的版本,那么如何隔离TclObject错误是由违规的TCL代码创建的呢?
更新5/16/19@13:34EST: Ubuntu18.04上的ActiveState 8.6.9也出现了相同的段错误。我还没有检查过我的SourceForge版本,看看它们是如何运行的。
https://stackoverflow.com/questions/56154861
复制相似问题