【发布时间】:2016-05-02 05:04:51
【问题描述】:
我创建了一种脚本语言,当它运行良好时,我将所有代码放在一个共享库中,并为它制作了一个包装器,但相同的代码在共享库中不起作用。我注意到代码在共享库中运行得更快,但由于内存问题,它总是崩溃,说索引超出数组长度,但相同的代码在库外完美运行。
我还注意到,如果我减少它必须做的工作量,它会在崩溃之前持续更长时间。
我的问题是,是什么导致了这次崩溃,我该如何阻止它发生?
P.S:我没有包含所有代码,因为整个代码有 1039 行(但如果您需要代码来解决问题,那么我可以链接到它),但我已经跟踪了一个函数的崩溃.令人困惑的是,该函数总是在第 821 次被调用时崩溃,以前从未有过,这是为了更优化的代码,当代码未优化并使用更多 CPU 时,它会在 702 处崩溃。
另外:我使用的是 DMD2,函数是使用 extern(C) 导出的,我正在 Linux 系统 Ubuntu 14.04 上测试所有这些。这就是我编译库的方式:
dmd -debug -gc "qscript.d" "qcompiler.d" "lists.d" "dllmain.d" "-shared" "-odobj/Debug" "-of/home/nafees/Desktop/Projects/QScr/QScr/bin/Debug/libQScr.so" -w -vcolumns
并使用 dlopen 函数加载。
如果您错过了我的问题:是什么导致了这次崩溃,我该如何阻止它发生?编辑:如何禁用垃圾收集器,gc.disable 不起作用,gc 未定义。
编辑:我已经跟踪了崩溃发生的“原因”,我在所有文件中都放置了调试代码,只是为了发现垃圾收集器正在弄乱内存中加载的脚本文件。我通过添加检查来“解决”问题,而不是实际上。它检查脚本是否“正常”,将其重新加载到内存中。这是避免崩溃,但问题仍然存在。这会将问题更改为:
如何禁用垃圾收集器> 顺便说一句,我尝试了 gc.disable,但 DMD 说 gc 未定义。
【问题讨论】:
-
MVCE 需要。
-
我已经更新了问题,现在我需要禁用垃圾收集器。
标签: crash shared-libraries d dmd