gpt4 book ai didi

crash - 相同的代码在共享库中将不起作用,但直接在程序中使用时将起作用

转载 作者:行者123 更新时间:2023-12-03 15:41:14 26 4
gpt4 key购买 nike

我创建了一种脚本语言,当它能完美工作时,我将所有代码都放在了共享库中,并对其进行了包装,但是相同的代码在共享库中不起作用。我注意到,代码在共享库中的运行速度更快,但是由于内存问题它总是崩溃,原因是索引超出了数组长度,但是完全相同的代码却在库外完美运行。
我还注意到,如果我减少了要做的工作量,那么它在崩溃之前会持续更长的时间。

我的问题是,是什么导致此崩溃,以及如何阻止它发生?

附注:我没有包含所有代码,因为整个代码只有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是 undefined 的。

编辑:我已经跟踪了“为什么”崩溃的发生,我在所有文件中放置了调试代码,只是为了发现垃圾收集器正在混乱加载在内存中的脚本文件。我通过添加检查来“解决”该问题,而不是“解决”问题。它检查脚本是否不正确,然后将其重新加载到内存中。这样可以避免崩溃,但是问题仍然存在。这将问题更改为:
我如何禁用垃圾收集器>顺便说一句,我尝试了gc.disable,但是DMD说gc是 undefined 的。

最佳答案

首次加载共享库时,必须初始化运行时。为此,您需要向您的库中添加类似的内容:

private __gshared bool _init = false;
import core.runtime: rt_init, rt_term;

export extern(C) void init()
{
if (!_init) rt_init;
}

export extern(C) void terminate()
{
if (_init) rt_term;
_init = false;
}

我的意思是那样,而不是那样。由于我们不知道您的脚本引擎如何使用,因此初始化计数器也可能有效:
private __gshared uint _init;
import core.runtime: rt_init, rt_term;

export extern(C) void init()
{
if (!_init) rt_init;
++init;
}

export extern(C) void terminate()
{
--init;
if (!_init) rt_term;
}

无论如何,您应该明白这一点。 undefined GC,因为您没有初始化低级D运行时。

关于crash - 相同的代码在共享库中将不起作用,但直接在程序中使用时将起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36975299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com