Debugging 在Lua中查找对对象的所有引用

Debugging 在Lua中查找对对象的所有引用,debugging,memory-leaks,lua,Debugging,Memory Leaks,Lua,我的应用程序的Lua部分出现内存泄漏。无论出于何种原因,我的对象不会在应该删除的时候被删除(即使我调用collectgarbage(“collect”))。我想这意味着我在某处有一个悬而未决的参考 那么,我如何获得一个对象的各种引用所在的列表呢?例如: obj = MyObject() ref = obj tbl = {obj} obj = nil print(getreferences(obj)) -- should print something like _G.ref, _G.tbl[1]

我的应用程序的Lua部分出现内存泄漏。无论出于何种原因,我的对象不会在应该删除的时候被删除(即使我调用
collectgarbage(“collect”)
)。我想这意味着我在某处有一个悬而未决的参考

那么,我如何获得一个对象的各种引用所在的列表呢?例如:

obj = MyObject()
ref = obj
tbl = {obj}
obj = nil
print(getreferences(obj)) -- should print something like _G.ref, _G.tbl[1]

我只需要为此编写自己的函数,但它无法找到闭包中包含的引用。有什么建议吗?

有一种工具可以穿越整个Lua宇宙。请参见

Lua表和对象没有名称。因此,您只会得到一个表地址列表,这并没有多大帮助。@Nicol Bolas:这不完全正确。如果我从顶层开始,并使用pairs(_G)向下搜索,直到找到一个值与我正在搜索的值匹配的键,我将获得引用的完整路径。我只是不知道如何从闭包外部访问闭包中的值。如果表是键呢?这完全是合法的Lua代码。如果表的键不是字符串怎么办?如果它根本不在全局表中呢?这也是完全可能的。它可以在注册表中,也可以在函数的本地环境中。Lua并不要求所有对象都可以从
\u G
@Nicol Bolas访问:我可以告诉你,在这个应用程序中,我只使用字符串和整数作为键。鉴于它是多么纯粹的lua,我认为它不在注册表中(尽管我对lua不太熟悉)。所以我看到的唯一问题是函数的局部变量。但是调试回溯能够提供关于这一点的信息,所以我肯定也有办法获得这些信息?@Nicol Bolas:Lua是垃圾收集的。因此,在某种程度上,必须有一个根对象(或根对象列表)。收集无法通过根对象访问的所有内容。您已经指出,
\u G
不能是那个根对象。然而,这个问题仍然很好。“GC找到的阻止收集我的对象的可达性路径是什么?”请参阅我的问题:。我相信这个脚本不会找到一个对象的所有引用。至少对我来说不是这样。小心使用。