• 2310D的dll问题


    原文
    我正在开发一个游戏引擎,偶然发现了一些空针问题.
    考虑此简单程序:

    class Test
    {
        void doIt(){}
    }
    void main()
    {
        Test t;
        t.doIt();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    它编译,然后在Linux上使用DMD时,用11信号干掉了.
    如果使用Java,甚至不会构建该程序,因为它会失败,说明从未初化它.

    但我不关心分析器,我宁愿有个运行时错误或异常显示它,何时何地有此无效值.

    我不知道有多少人在D中使用DLL开发,但它的体验远非理想,放在类中及热加载,等可能会更糟.

    每当程序崩溃而没有消息时,我只需转到VisualStudio并打开exe并再次试运行它.这次也一样,它无法在程序上找到内容,相反,它得到了一个完全随机和误导性的错误消息.

    确切地说,它是个空针.
    是的,此时,它相当简单,但我正重构过程中,我不用数组,而是使用:
    因此,化简并检查此代码:

    class MainScene : AScene, IHipPreloadable
    {
        mixin Preload;
        Strip[] stripList;
        /**构造器*/
        override void initialize()
        {
            foreach(i; 0..30)
            {
                import hip.math.random;
                Strip s = new Strip();
                stripList~= s;//..
                s.pos.x = Random.range(0, 800);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    重构后,得到了以下代码:

    class MainScene : AScene, IHipPreloadable
    {
        mixin Preload;
        Pool!Strip stripList;
        /**构造器*/
        override void initialize()
        {
            foreach(i; 0..30)
            {
                import hip.math.random;
                stripList.get().pos.x = Random.range(0, 800);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    现在,问题很明显!我需要用new Pool!Strip()初化池实例.但是当我这样做时,并不明显,(使用LDC构建)错误消息未帮助我解决问题.

    除了该简单问题外,还有热加载.

    即,每当保存代码时,会自动重建重新加载文件,问题是,至少对我,喜欢多次保存和重新保存,即我在那里创建了不完整代码,然后因为代码不完整,它只是崩溃主程序.
    目前,没有明显方法可以控制它说"没关系,只需卸载DLL".

    从一开始,使用DLL对我一直很痛苦,很难找到正确的标志,不同编译器的行为又不同,且支持不完整!

    我相信现在要求某人修复DLL只会有0优先级,所以,在此我提出请求,这将使整个语言受益,远远超出当前热门的新主题.

    我使用DLL并在我的引擎中热加载.
    我有一个文件模块:这里,它适合Linux/Windows.

    我这样设置信号处理器,非常简单:

    version(DLL) export extern(C) void on_reload(State* state) {
        LINFO("reloaded");
        debug rt_register_crash_handler();
    }
    
    • 1
    • 2
    • 3
    • 4

    DLL中的此例代码:

    int* test = null;
    *test = 5;
    
    • 1
    • 2

    会给我:

    -------------------------------------------------------------------+
    Received signal 'exception' (3221225477ll)
    -------------------------------------------------------------------+
    C:\dev\kdom\projects\game\app.d:144 - game.app.on_tick
    C:\dev\kdom\projects\game\app.d:144 - game.app.on_tick
    C:\dev\kdom\projects\game\app.d:144 - rt_register_crash_handler
    C:\dev\kdom\projects\game\app.d:144 - BaseThreadInitThunk
    C:\dev\kdom\projects\game\app.d:144 - RtlUserThreadStart
    make: *** [makefile:36: game-run] Error 2816
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    现在我知道了代码失败的确切位置,我可修复

    version(DLL) export extern(C) void on_tick(State* state) {
        if (state.engine.input.is_key_just_pressed(Key.KEY_SPACE))
        {
            int* test = null;
            *test = 5;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    有人做了个PR来搞类似的,但我忘记了在哪(标准库或运行时).

    多谢!我会试使用它,看看能用它走多远:D

  • 相关阅读:
    毕昇编译器优化:Lazy Code Motion
    高阶数据结构学习之跳表
    Three.js教程之在网页快速实现 3D效果(教程含源码)
    【C++】C++职工信息管理系统
    【C++ STL】模拟实现 string
    Web3和区块链开发国内外顶级资源大赏
    Linux上部署net6应用
    day25可变参数&综合练习
    算法之双指针题型:
    企业的固定资产管理怎么操作
  • 原文地址:https://blog.csdn.net/fqbqrr/article/details/134006304