温馨提示:本文翻译自stackoverflow.com,查看原文请点击:memory - Debugging Fatal Error
memory tcl tk

memory - 调试致命错误

发布于 2020-05-02 02:27:36

我有一个用R编写的GUI,该GUI利用了Tcl / TK包,同时还使用了一个Tcl库的C.dll。我对此问题进行了一些研究,它似乎与内存有关。我是一个没有经验的程序员,所以我不确定应该在哪里寻找此内存问题。的每次调用malloc()有一个匹配的free(),并用相同的类似Tcl_Alloc()Tcl_Free()这个错误也很难重现,因此恐怕我无法提供可重现的示例,因为它本质上看似随机。然而,一种模式是它似乎仅在程序关闭时发生,尽管这是非常不一致的。

通过发布这篇文章,我希望获得一个逻辑过程,人们应该尝试在Tcl / Tk-C-R应用程序的一般情况下调试此问题。我不是在寻找针对我的代码的解决方案,而是个人在遇到此问题时应考虑的问题。

查看更多

提问者
hkj447
被浏览
36
Donal Fellows 2020-02-13 03:28

该消息来自函数Ptr2Block()tclThreadAlloc.c(或者还有别的关于产生相同的错误消息,可能的,但可能性不大),这是Tcl的特定线程内存分配器(它被广泛应用于内部的Tcl减少次数全球锁命中) 。具体来说就是:

if (blockPtr->magicNum1 != MAGIC || blockPtr->magicNum2 != MAGIC) {
    Tcl_Panic("alloc: invalid block: %p: %x %x",
            blockPtr, blockPtr->magicNum1, blockPtr->magicNum2);
}

问题?这些零应为MAGIC(等于0xEF)。这表明某些内容已覆盖了内存块的元数据(还应包括该块的大小,但现在可能是热垃圾),并且程序内存的完整性不再受信任。las,此时,我们现在正在处理处于破裂状态的程序,该状态之前发生了破裂。发生恐慌的地方仅仅是检测到错误的地方,而不是错误的实际位置

进一步的调试通常是通过关闭所有功能的版本来完成的(在Tcl的代码中,这是通过PURIFY在构建时定义符号来完成的)关闭所有内容的版本,然后使用诸如此类的工具运行结果代码(希望它仍然存在错误)electricfencepurify(因此使用特殊符号名称)以查看发现了哪些类型的越界错误;他们非常擅长解决此类问题。