xLua icon indicating copy to clipboard operation
xLua copied to clipboard

Unity的.NET 4.X Equivalent + Hotfix 导致Visual Studio无法断点调试和定位代码

Open jjqjjq opened this issue 4 years ago • 15 comments

请问下Unity2019下直接就是.NET 4.X Equivalent,无法切换回.NET 3.5 Equivalent,直接导致无法调试和定位代码。 有没有高手指点指点? 感激不尽! image image

jjqjjq avatar Jul 08 '20 11:07 jjqjjq

你更新cecil的版本试试。 另外,注入只是要改bug时要测试代码才需要,平时不需要注入。

chexiongsheng avatar Jul 13 '20 03:07 chexiongsheng

试过更新版本了并没有效果,实验条件如下 1.使用对应Unity版本的cecil文件 2.Untiy版本为2018 3.切到.NET 4.X Equivalent,无法断点 4.切到.NET 3.5 Equivalent ,可断点(切换前后无其他操作)

目前已关闭热补丁进行研发,无碍:)

jjqjjq avatar Jul 15 '20 08:07 jjqjjq

我们现在在2018.4.23上升级.NET到4.5也遇到了这个问题,尝试过升级cecil(从editor中把Mono.Cecil.dll Mono.Cecil.Mdb.dll Mono.Cecil.Pdb.dll 覆盖到工程文件的Tools文件夹下)无法解决。 请问后续是否会对这个问题进行处理呢,我们项目的线上版本,为了与线上完全一致,程序和策划都是需要注入xlua载入hotfix 的lua后运行的,所以其实不太能在线上版本中去掉注入进行调试和开发

8Avalon8 avatar Apr 08 '21 03:04 8Avalon8

我们现在在2018.4.23上升级.NET到4.5也遇到了这个问题,尝试过升级cecil(从editor中把Mono.Cecil.dll Mono.Cecil.Mdb.dll Mono.Cecil.Pdb.dll 覆盖到工程文件的Tools文件夹下)无法解决。 请问后续是否会对这个问题进行处理呢,我们项目的线上版本,为了与线上完全一致,程序和策划都是需要注入xlua载入hotfix 的lua后运行的,所以其实不太能在线上版本中去掉注入进行调试和开发

按你们的要求,其实injectfix更适合你们用。

chexiongsheng avatar Apr 12 '21 09:04 chexiongsheng

我们现在在2018.4.23上升级.NET到4.5也遇到了这个问题,尝试过升级cecil(从editor中把Mono.Cecil.dll Mono.Cecil.Mdb.dll Mono.Cecil.Pdb.dll 覆盖到工程文件的Tools文件夹下)无法解决。 请问后续是否会对这个问题进行处理呢,我们项目的线上版本,为了与线上完全一致,程序和策划都是需要注入xlua载入hotfix 的lua后运行的,所以其实不太能在线上版本中去掉注入进行调试和开发

你改下这里试试:https://github.com/Tencent/xLua/blob/d60930196e8a3ab1936251d5a99432df2d783f10/Assets/XLua/Src/Editor/Hotfix.cs#L831 加上对pdb的处理

chexiongsheng avatar Apr 12 '21 09:04 chexiongsheng

你改下这里试试:

https://github.com/Tencent/xLua/blob/d60930196e8a3ab1936251d5a99432df2d783f10/Assets/XLua/Src/Editor/Hotfix.cs#L831

加上对pdb的处理

感谢回复!不过我看了下对应代码,这部分的代码要开启宏XLUA_GENERAL,默认使用的时候没开这个,开了的话也会报错,这个函数也不会执行,这里需要做什么操作吗

8Avalon8 avatar Apr 13 '21 05:04 8Avalon8

我大致搞明白了,做了以下尝试 重新生成xluagenerate 根据writeAssembly的写法加入对pdb的处理 if (File.Exists(pdbPath + ".pdb")) { var writerParameters = new WriterParameters { WriteSymbols = true }; assembly.Write(assemblyPath, writerParameters); } 不过我实际执行的时候我看这里传入的assemblyPath带.dll的后缀,+pdb或mdb之后会找不到,所以修改了下 https://github.com/Tencent/xLua/blob/d60930196e8a3ab1936251d5a99432df2d783f10/Assets/XLua/Src/Editor/Hotfix.cs#L836 生成之后再hotfixineditor,生成了个1kb的Assembly-CSharp.dll.mdb 注入成功,但是不能调试

然后用我对应的unity版本的cecil dll 替换了 XluaHotfixInject的cecei引用以及tool底下的,然后会导致生成的Assembly-CSharp.dll 大小为0kb 上述都是直接下载的最新源码做的实验 Unity版本 2018.4.24

8Avalon8 avatar Apr 13 '21 08:04 8Avalon8

为啥要生成个1kb的mdb? 之前漏了一个地方,读的也要加下: https://github.com/Tencent/xLua/blob/d60930196e8a3ab1936251d5a99432df2d783f10/Assets/XLua/Src/Editor/Hotfix.cs#L814 不用生成什么mdb

chexiongsheng avatar Apr 13 '21 09:04 chexiongsheng

这个mdb是自动生成的。 我在readAssembly加上pdb的判断之后会报错 Could not find file "D:\xLua-master\Library\ScriptAssemblies\Assembly-CSharp.dll.mdb" 对这个不太熟,如何能让他读取pdb文件呢

8Avalon8 avatar Apr 13 '21 10:04 8Avalon8

cecil要升级到高版本。 另外,还要确定一件事,你那有没存在Assembly-CSharp.dll.pdb呢?

chexiongsheng avatar Apr 13 '21 10:04 chexiongsheng

有的,我正在做尝试,只加ReadSymbols = true好像默认只会找mdb,加了SymbolReaderProvider 就能载入了 var readerParameters = new ReaderParameters { ReadSymbols = true , SymbolReaderProvider = new Mono.Cecil.Pdb.PdbReaderProvider() }; 但是又新的报错 Error:D:\xLua-master\Library\ScriptAssemblies\Assembly-CSharp.dll inject Exception! System.OutOfMemoryException: Out of memory

我再试一下更新cecil

8Avalon8 avatar Apr 13 '21 10:04 8Avalon8

升级了Cecil的库,终于OK了,readassembly改动如下,writeassembly对应也修改了这里就不贴了: var absAssembly = assemblyPath.TrimEnd(".dll".ToCharArray()); if (File.Exists(absAssembly + ".mdb")) { var readerParameters = new ReaderParameters { ReadSymbols = true }; return AssemblyDefinition.ReadAssembly(assemblyPath, readerParameters); } else if (File.Exists(absAssembly + ".pdb")) { var readerParameters = new ReaderParameters { ReadSymbols = true , SymbolReaderProvider = new Mono.Cecil.Pdb.PdbReaderProvider() }; return AssemblyDefinition.ReadAssembly(assemblyPath, readerParameters); } else { return AssemblyDefinition.ReadAssembly(assemblyPath); }

8Avalon8 avatar Apr 13 '21 10:04 8Avalon8

可以提一个PR过来

chexiongsheng avatar Apr 14 '21 07:04 chexiongsheng

我大致搞明白了,做了以下尝试 重新生成xluagenerate 根据writeAssembly的写法加入对pdb的处理 if (File.Exists(pdbPath + ".pdb")) { var writerParameters = new WriterParameters { WriteSymbols = true }; assembly.Write(assemblyPath, writerParameters); } 不过我实际执行的时候我看这里传入的assemblyPath带.dll的后缀,+pdb或mdb之后会找不到,所以修改了下

https://github.com/Tencent/xLua/blob/d60930196e8a3ab1936251d5a99432df2d783f10/Assets/XLua/Src/Editor/Hotfix.cs#L836

生成之后再hotfixineditor,生成了个1kb的Assembly-CSharp.dll.mdb 注入成功,但是不能调试 然后用我对应的unity版本的cecil dll 替换了 XluaHotfixInject的cecei引用以及tool底下的,然后会导致生成的Assembly-CSharp.dll 大小为0kb 上述都是直接下载的最新源码做的实验 Unity版本 2018.4.24

重新生成xluagenerate,是指重新生成/Tools/XLuaGenerate.exe么?我们项目也想在存在补丁和Lua写的功能环境下调试C#代码,从上面看下来,到这里就迷糊了,能具体说明下么

Winvz avatar Aug 02 '22 09:08 Winvz

我大致搞明白了,做了以下尝试 重新生成xluagenerate 根据writeAssembly的写法加入对pdb的处理 if (File.Exists(pdbPath + ".pdb")) { var writerParameters = new WriterParameters { WriteSymbols = true }; assembly.Write(assemblyPath, writerParameters); } 不过我实际执行的时候我看这里传入的assemblyPath带.dll的后缀,+pdb或mdb之后会找不到,所以修改了下 https://github.com/Tencent/xLua/blob/d60930196e8a3ab1936251d5a99432df2d783f10/Assets/XLua/Src/Editor/Hotfix.cs#L836

生成之后再hotfixineditor,生成了个1kb的Assembly-CSharp.dll.mdb 注入成功,但是不能调试 然后用我对应的unity版本的cecil dll 替换了 XluaHotfixInject的cecei引用以及tool底下的,然后会导致生成的Assembly-CSharp.dll 大小为0kb 上述都是直接下载的最新源码做的实验 Unity版本 2018.4.24

重新生成xluagenerate,是指重新生成/Tools/XLuaGenerate.exe么?我们项目也想在存在补丁和Lua写的功能环境下调试C#代码,从上面看下来,到这里就迷糊了,能具体说明下么

请问之后搞明白了吗?我也遇到了同样的问题

AaronYard avatar Jan 11 '23 11:01 AaronYard