Page's Personal Website

Vs2015调用c#dll宕机问题

2019-01-22
c++
 

[TOC]

问题

今天遇到一个奇怪的问题,vs2015 Debug启动客户端,结果宕机

crash

  • 堆栈

stack

这里有个理解错误:从这里其实可以看出来应该是脚本那边出了问题,但是自己理解是客户端用到的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

[2]SOLVED: C++ calling Managed C++ Dll -> EEFileLoadException in debugger but works correctly if I just run from windows directly.

[3]EEFileLoadException when using C# classes in C++(win32 app)


Similar Posts

Comments