MoeHero icon indicating copy to clipboard operation
MoeHero copied to clipboard

老图中使用lua调用cj部分关键函数魔兽程序崩溃

Open Sdator opened this issue 4 years ago • 4 comments

@sumneko 我把 MoeHero 项目的一部分代码加入了一张slk优化过的老图中

  • scripts/main.lua
local function main()
    require 'war3.id'
    require 'war3.api'
    require 'util.log'
    -- 当导入这个模块里面导入的 'ac.timer' 模块 85行调用cj的计时器函数发生了崩溃
    require 'ac.init'
    require 'util.error'
   -- 我自定义的触发
    require 'test.main'
end
  • scripts/test/main.lua
local CJ = require 'jass.common'
local message = require 'jass.message'

local trig = CJ.CreateTrigger()
local g = require 'jass.globals'

CJ.TriggerRegisterPlayerEvent(trig,CJ.Player(0),g.EVENT_PLAYER_END_CINEMATIC)
-- ESC 调用时崩溃
CJ.TriggerAddCondition( trig,
    CJ.Condition(
        function()
            print("test")
            return true
        end
    )
)
CJ.TriggerAddAction(trig,function()
    local x, y = message.mouse()
        print(x, y)
    end
)

一开始我以为是那行代码引起的问题,当我把require 'ac.init'注释后,此时可以进游戏了,但当我调用自己编写的触发函数时发现一样会崩溃,确定了问题出在当我调用 'jass.common' 模块中 计时器和触发事件动作就会发生崩溃。

1

这个崩溃问题只在一张老图中出现,图本身是加密过的,我是通过注入部分文件实现lua功能,但是我在ydwe中新创建的地图注入同样的代码并不会发生程序崩溃。

  • jass.globals 全局函数全部能读取说明接口是没问题的
  • Player(n) 之类的函数也能用

以下三个函数都会崩溃

TimerStart
TriggerRegisterPlayerEvent
TriggerAddAction

好像出现问题的地方都是因为使用了匿名函数,能力有限不知道具体原因是什么。

2020.6.19

经过多次排查最后发现问题是发生在 war3map.j 文件中的主入口 mian 函数里面的

  • war3map.j
mian
   xxx
   call Cheat("exec-lua:lua.base")
   call InitGlobals()
   // 问题出在这里 初始化游戏触发
   call InitCustomTriggers()
   xxx

最后定位到崩溃的地方,是在初始化触发中的一个很普通的触发函数体内,里面的一句call TriggerRegisterPlayerEvent引发的报错,但这句代码本身没有问题。我测试过即便是我重新定义的触发器也会报错。 会不会是触发数量过多导致下标溢出?初始化触发的数量大概140+ 左右。

最后同问这个问题,如何在魔兽中进行lua单步调试 #23

Sdator avatar Jun 18 '20 07:06 Sdator

你解决了吗~

Silent-zzz avatar Jun 20 '20 01:06 Silent-zzz

https://github.com/actboy168/YDWE/issues/197

w4454962 avatar Jun 20 '20 03:06 w4454962

你解决了吗~

还没

Sdator avatar Jun 20 '20 03:06 Sdator

actboy168/YDWE#197

看来你和我碰到差不多的问题,你使用什么方法解决的? 我尝试过使用全局变量 code 调用也一样会报错,不单单是闭包问题。

Sdator avatar Jun 20 '20 03:06 Sdator