[TOC]
问题
今天遇到一个奇怪的问题,vs2015 Debug启动客户端,结果宕机
- 堆栈
这里有个理解错误:从这里其实可以看出来应该是脚本那边出了问题,但是自己理解是客户端用到的dll不匹配。
- 环境
(1)c++客户端工程:vs2012
(2)c#脚本工程:vs2015
- 怪异
(1)直接启动ClientD.exe,并不会宕机
(2)vs2012启动ClientD.exe也不会宕机
我的vs2015有问题?
解决
EEFileLoadException
Output信息得出有这个异常,就从*EEFileLoadException *关键字搜了点信息
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: EEFileLoadException,位于内存位置 0x000000DF6E179560 处。
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: [rethrow],位于内存位置 0x0000000000000000 处。
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: EEFileLoadException,位于内存位置 0x000000DF6E179560 处。
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: [rethrow],位于内存位置 0x0000000000000000 处。
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: EEFileLoadException,位于内存位置 0x000000DF6E179560 处。
0x00007FFDB1C04008 (KernelBase.dll)处(位于 ClientD.exe 中)引发的异常: 0xE0434352 (参数: 0xFFFFFFFF80070002, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00007FFD77EB0000)。
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: EEFileLoadException,位于内存位置 0x000000DF6E179560 处。
唯一有用的信息是,C++这边宕在了C#的dll里面,这部分属于Unmanagd dll。
[3]:提到了一些概念,managed .dll(托管的dll),这里简单回忆一下就是c#的dll相对于c++来说是 unmanaged.dll
突破
因为想到代码肯定还是script那边出问题了,只是说没有断下来,所以看了下Output输出日志,Console的日志的两个问题都解决了还是报错。
- 发现
在运行时,Output一直输出下面的日志,说明GameObject.dll某个地方用了空引用
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
- catch
问了下c#比较牛逼的同事,想问下这个地方能不能快速定位在哪个位置。他说可能被catch了,所以我把catch (Exception ex)的地方搜了一遍,174个。下面这种写法
catch (Exception ex)
{
Debug.Output(ex.ToString());
return null;
}
主要是Debug.Output输出,还有Debug.Error等函数。在Debug.Output函数里面断点没有选下来,其他的输出函数也没有断下来,所以应该不是这个Catch导致的
- 手动查虫
Debug启动script工程,不断的从最底层逻辑开始断点。最后终于找到了出问题的函数:
public State GetTeamState()
{
// 省略...
List<Npc> npcList = NpcMgr.GetInstance().GetNpcList();
// 问题出在这里的teamList是null
foreach (Npc npc in teamList)
{
// 省略...
}
return state;
}
小结
- 出现这种报错的问题,最终还是自己代码的问题,而不是vs的问题。但是可以猜测一下vs2015比vs2012的检查应该更加严格(相同的工程)
- 这个问题出现的最终原因是,自己写的函数GetTeamState没有catch异常,而在上一层捕获了异常,却啥都没做,catch内容是空的,所以才导致没有输出有用的信息
参考
[1]C# exception thrown from a C++ managed dll - EEFileLoadException * __ptr64
[3]EEFileLoadException when using C# classes in C++(win32 app)