-
Notifications
You must be signed in to change notification settings - Fork 679
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
[UE] Bug: TS对UE原生容器for of迭代的异常表现?似乎是局部变量被提前GC了 #1776
Comments
应该是v8的认为后续代码用不上StructA了,于是释放了。 |
是的,我们工程里最后加了一行打印StructA的Num后就不会出现此问题了,这算不算是v8的BUG? |
这是v8的gc算法先进性/或者是编译优化做的好的体现。 |
其实按v8运行的实例个数和时长来说,和操作系统核心模块是一个级别的。有问题动不动怀疑是v8的bug有点盲目自信了。 |
我觉得你是把c++的scope的一些对象声明周期管理给拿到其它语言了。 |
你这种情况反而比较少见,所以WITH_OUTER_LINK也不是专门解决这种问题。 let test = StrunctA.MyTestB 有个团队(有比较多的外包)如上错误比较多,所以我加了WITH_OUTER_LINK,但我不知道是不是普遍现象。 |
你说的这个问题我们考虑到了,所以我们才觉得只要我持有最外层的Struct的引用,内层的的值就不会释放,现在看起来并不能,最外层的值在v8看起来没有再用了就可能会释放。我猜其他团队也许是恰好最外层还在用,而且本身这个复现的几率就很小。 |
其实你的理解还是有些问题:你的理解是语言语法描述有个变量A,于是真实代码编译运行后,还是得有个变量A对应的某个实体。 但实际上变量,可见性都是语言层面的东西,真正的程序/虚拟机中是不必要有的,甚至编译阶段就优化掉。当然也有虚拟机实现有这么个变量实体,比如lua虚拟机会有个upvalue数组。 |
你这么说也没错,我是没想到这个脚本语言都能优化到这样,而且for of这里不算是引用StructA也很隐蔽(相当于有个this = StructA.MyTestB ?所以第二次循环就不会在用到StructA了) |
前置阅读 | Pre-reading
Puer的版本 | Puer Version
1.0.6
UE的版本 | UE Version
5.3
发生在哪个平台 | Platform
Editor(win)
错误信息 | Error Message
TS代码里,Obj是一个U对象,TestA,TestB是UStruct
UCLASS()
class UDummyObj : public UObject
{
GENERATED_BODY()
public:
int num;
};
USTRUCT(BlueprintType)
struct FTestB
{
GENERATED_USTRUCT_BODY()
public:
};
USTRUCT(BlueprintType)
struct FTestA
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere)
TMap<int, FTestB> MyTestB;
};
UCLASS()
class UTestOuter : public UObject
{
GENERATED_BODY()
public:
};
问题重现 | Bug reproduce
https://github.com/slowmna/puerts_unreal_demo
![image](https://private-user-images.githubusercontent.com/38640830/344015141-141cb298-c4f8-4c04-ae7a-fb19648fd82b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk3NTYwNzIsIm5iZiI6MTcxOTc1NTc3MiwicGF0aCI6Ii8zODY0MDgzMC8zNDQwMTUxNDEtMTQxY2IyOTgtYzRmOC00YzA0LWFlN2EtZmIxOTY0OGZkODJiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MzAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjMwVDEzNTYxMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ4MGZhMThlYjJjNzhlMTg5NmEwNThkZDNlZGY3ZWQwMWNkMGUzMGUwOTcwMGMwNDMzNmMxYmEwMjEwNjQxMzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.wJK-zZ0zKTdFi0SfGPwOE4clRfa36cCv24vNCccQIv8)
已经提交了复现工程,直接运行放着跑,我这里几分钟之后第一次打印出console.errorr
从图上可以看到TestA的地址被释放了然后才for of遍历的
大概10分钟后就频繁出现,几乎稳定必现:
![image](https://private-user-images.githubusercontent.com/38640830/344015318-de146e63-7c24-4344-91ef-655f11fc8bf2.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk3NTYwNzIsIm5iZiI6MTcxOTc1NTc3MiwicGF0aCI6Ii8zODY0MDgzMC8zNDQwMTUzMTgtZGUxNDZlNjMtN2MyNC00MzQ0LTkxZWYtNjU1ZjExZmM4YmYyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MzAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjMwVDEzNTYxMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVmNzIwMDk2ZGFlMzJjOTU4MjI1M2M4OGYzYjc0OTdkNjI4YzI2YWFmZWViZTYyOGIwOWNjODE5MWI2YmJiZDcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0._4XQKBJk1X8Z0r3XD3NJsFYPjXGaUYwYWAMH5ZFG-ok)
The text was updated successfully, but these errors were encountered: