调试器不同意Debug.Assert

时间:2018-01-08 02:33:51

标签: c# .net-core 64-bit

我的一个构造函数抛出了一个“ArgumentNullException”,所以我开始调试。

我发现了这个奇怪的问题。 如您所见,调试器说我的propsSegment不为null;但Debug.Assert表示它为空。

这里发生了什么?

这是一个.Net Core 2.0项目,正在编译为x64。 我正在运行一个线程并且有足够的内存来备用。

如果你们想检查来源,项目将被托管here。 我创建了一个分支来展示这个问题。 如果您尝试编译它,您将需要一个“otbm”文件。 我使用的是压缩here

编辑:downvotes让我觉得我错过了一些明显的东西。 有人可以告诉我它是什么?

enter image description here

完整的堆栈跟踪:

System.ArgumentNullException
  HResult=0x80004003
  Message=Value cannot be null.
  Source=System.Private.CoreLib
  StackTrace:
   at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
   at System.ArraySegment`1.op_Implicit(T[] array)
   at COTS.GameServer.World.WorldLoader.ConvertingParsingNode(Byte[] serializedWorldData, ParsingWorldNode subtree) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 153
   at COTS.GameServer.World.WorldLoader.<>c__DisplayClass10_0.<ConvertingParsingNode>b__0(ParsingWorldNode c) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 148
   at System.Linq.Enumerable.SelectListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at COTS.GameServer.World.WorldLoader.ConvertingParsingNode(Byte[] serializedWorldData, ParsingWorldNode subtree) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 146
   at COTS.GameServer.World.WorldLoader.<>c__DisplayClass10_0.<ConvertingParsingNode>b__0(ParsingWorldNode c) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 148
   at System.Linq.Enumerable.SelectListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at COTS.GameServer.World.WorldLoader.ConvertingParsingNode(Byte[] serializedWorldData, ParsingWorldNode subtree) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 146
   at COTS.GameServer.World.WorldLoader.<>c__DisplayClass10_0.<ConvertingParsingNode>b__0(ParsingWorldNode c) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 148
   at System.Linq.Enumerable.SelectListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at COTS.GameServer.World.WorldLoader.ConvertingParsingNode(Byte[] serializedWorldData, ParsingWorldNode subtree) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 146
   at COTS.GameServer.World.WorldLoader.<>c__DisplayClass10_0.<ConvertingParsingNode>b__0(ParsingWorldNode c) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 148
   at System.Linq.Enumerable.SelectListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at COTS.GameServer.World.WorldLoader.ConvertingParsingNode(Byte[] serializedWorldData, ParsingWorldNode subtree) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 146
   at COTS.GameServer.World.WorldLoader.ConvertParsingTree(Byte[] serializedWorldData, ParsingWorldNode root) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 135
   at COTS.GameServer.World.WorldLoader.ParseWorld(Byte[] serializedWorldData) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\World\WorldLoader.Methods.cs:line 31
   at COTS.GameServer.Program.Main(String[] args) in C:\Source\CoreOpenTibiaServer\CoreOpenTibiaServer\src\COTS.GameServer\Program.cs:line 20

1 个答案:

答案 0 :(得分:1)

这是ArraySegment的一个未解决的问题。见https://github.com/dotnet/coreclr/issues/14012

但请注意,您不需要检查null,因为ArraySegment是一个结构。

我的猜测是ArraySegment的等于运算符试图隐式地将null转换为ArraySegment,这可能是生成实际NullReference异常的原因。