Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用luapanda调试unlua工程时候,偶现crash #41

Closed
ghost opened this issue Nov 19, 2019 · 9 comments
Closed

使用luapanda调试unlua工程时候,偶现crash #41

ghost opened this issue Nov 19, 2019 · 9 comments
Labels
unlua issue about unlua

Comments

@ghost
Copy link

ghost commented Nov 19, 2019

使用luapanda调试unlua工程时候,有时会出现如下错误
UE4Editor_UnLua!FVector::ToString()
然后unreal就自动关闭了

环境:
操作系统 win10
unreal 4.22.3
luapanda 3.0.1

偶现,但出现概率挺高,看能否解决

@stuartwang
Copy link
Collaborator

stuartwang commented Nov 19, 2019

我们定位了一下问题,crash发生在LuaPanda.lua processWatchedExp函数2575行

var.value = tostring(retString)

这行的作用是把观察变量取得的变量值,转换为string。之后序列化发给前台以便展示。
也就是一些系统变量在做tostring转化时,出现了问题。

必现办法是:比如在watch中加入UE4.FVector,调试器就会立刻crash掉。
或者在用户lua代码中加入 tostring(UE4.FVector); 运行工程,ue也会crash.

问题可能的原因是unlua目前对一些变量的tostring没有处理好,我们后面看下有没有办法绕过

@Tencent Tencent deleted a comment Dec 17, 2019
@hxhb
Copy link

hxhb commented Feb 22, 2020

我们定位了一下问题,crash发生在LuaPanda.lua processWatchedExp函数2575行

var.value = tostring(retString)

这行的作用是把观察变量取得的变量值,转换为string。之后序列化发给前台以便展示。
也就是一些系统变量在做tostring转化时,出现了问题。

必现办法是:比如在watch中加入UE4.FVector,调试器就会立刻crash掉。
或者在用户lua代码中加入 tostring(UE4.FVector); 运行工程,ue也会crash.

问题可能的原因是unlua目前对一些变量的tostring没有处理好,我们后面看下有没有办法绕过

请问现在有解决的办法吗?

@stuartwang
Copy link
Collaborator

stuartwang commented Feb 22, 2020

请问现在有解决的办法吗?

想先说下调试器对变量进行 tostring() 的原因:
调试器有 lua 端和 vscode 插件两部分,他们之间通过tcp通信。遇到断点时,调试器 lua 端把获得的变量信息序列化后发给 VSCode 端,VSCode插件把这些信息反序列化后展示。我们这里调用 tostring 的目的就是对获得的变量进行序列化,以便传输。

所以我认为这里有两种可能,一种是 unlua 修复变量的 tostring() 方法。另一种是 unlua 提供他们自己的的变量序列化方法,我们做一下适配也可以解决。

就这个问题我理解比较依赖 unlua 的处理,核心是找到一个不 crash 的变量序列化方法。

感谢提问,我们也会关注这个问题~

@hxhb
Copy link

hxhb commented Feb 25, 2020

请问现在有解决的办法吗?

想先说下调试器对变量进行 tostring() 的原因:
调试器有 lua 端和 vscode 插件两部分,他们之间通过tcp通信。遇到断点时,调试器 lua 端把获得的变量信息序列化后发给 VSCode 端,VSCode插件把这些信息反序列化后展示。我们这里调用 tostring 的目的就是对获得的变量进行序列化,以便传输。

所以我认为这里有两种可能,一种是 unlua 修复变量的 tostring() 方法。另一种是 unlua 提供他们自己的的变量序列化方法,我们做一下适配也可以解决。

就这个问题我理解比较依赖 unlua 的处理,核心是找到一个不 crash 的变量序列化方法。

感谢提问,我们也会关注这个问题~

我测试了一下,这是因为UE.FVector这个用法不会走FVector的构造,导致调用tostring的时候传递进去的是一个空指针。而UE4.FVector()就可以。

这样是OK的:

function Cube_Blueprint_C:ReceiveBeginPlay()
    print(tostring(UE4.FVector()))
end

这样就不会调用FVector_New,从而在调用tostring的时候会crash:

function Cube_Blueprint_C:ReceiveBeginPlay()
    print(tostring(UE4.FVector))
end

@stuartwang
Copy link
Collaborator

stuartwang commented Feb 25, 2020

收到。根据上面结果,我的初步想法是:在调试器获取到要展示的变量后,通过某些方式(按变量名或者type()等)判断它是 lua 基本类型还是 unlua 的 UE4.xxx 类型,如果是基础类型,就直接用tostring()序列化。如果是UE4.xxx, 那么调用它一下再使用tostring。

@stuartwang stuartwang reopened this Feb 25, 2020
@stuartwang
Copy link
Collaborator

stuartwang commented Feb 25, 2020

我今天看了下,上面方案是不行的。从类型来说 UE4.FVector 是 function , 而 UE4.FVector() 是返回值的类型。一些成员类型的变量也不能直接加() ,比如 UE4.UKismetSystemLibrary 。

因为crash 都发生在 UE4 提供的一些方法中,我可以做一些工作,让用户主动查阅需要的变量,避免不经意查询了 UE4 的提供方法。
从我自己的测试状况,造成 crash 的行为主要是

  • 鼠标不小心悬停在了会 crash 的方法上(会进行变量查询,然后 crash)
  • 查询所有 global 变量(因为其中包含 UE4.FVector 等 userdata)
    所以我准备:
  • 禁止鼠标悬停查询变量
  • 停止在变量展示区 展示全部 global 变量
    这样查询全局变量会稍麻烦一点,需要使用 watch 或调试控制台输入变量名查询,如下
    image

但只要用户不主动查询 UE4 提供的方法,应该都是安全的

@stuartwang
Copy link
Collaborator

我在 master 分支提交了一个 vsix 文件夹,按上面的思路打了个包,可以安装上试下。
image
下载到 vsix 文件后,可以按下面的办法安装
image

@stuartwang stuartwang added the unlua issue about unlua label Feb 25, 2020
@hxhb
Copy link

hxhb commented Feb 26, 2020

我在 master 分支提交了一个 vsix 文件夹,按上面的思路打了个包,可以安装上试下。
image
下载到 vsix 文件后,可以按下面的办法安装
image

好的,我试一下~

@stuartwang
Copy link
Collaborator

stuartwang commented Feb 28, 2020

unlua 的更新似乎解决了这个bug, 参见下方相关issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
unlua issue about unlua
Projects
None yet
Development

No branches or pull requests

2 participants