Vs2015调用c#dll宕机问题

栏目: 编程工具 · 发布时间: 7年前

内容简介:[TOC]今天遇到一个奇怪的问题,vs2015 Debug启动客户端,结果宕机

[TOC]

问题

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

Vs2015调用c#dll宕机问题

  • 堆栈

Vs2015调用c#dll宕机问题

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

搜索引擎

搜索引擎

W.Bruce Croft、Donald Metzler、Trevor Strohman / 刘挺、秦兵、张宇、车万翔 / 机械工业出版社 / 2010-6-1 / 56.00元

本书介绍了信息检索(IR)中的关键问题,以及这些问题如何影响搜索引擎的设计与实现,并且用数学模型强化了重要的概念。对于网络搜素引擎这一重要的话题,书中主要涵盖了在网络上广泛使用的搜索技术。 本书适用于高等院校计算机科学或计算机工程专业的本科生、研究生,对于专业人士而言,本书也不失为一本理想的入门教材。一起来看看 《搜索引擎》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试