Vs2015调用c#dll宕机问题

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

内容简介:[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)


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

查看所有标签

猜你喜欢:

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

MacTalk 人生元编程

MacTalk 人生元编程

池建强 / 人民邮电出版社 / 2014-2-1 / 45

《MacTalk·人生元编程》是一本随笔文集,主要内容来自作者的微信公众平台“MacTalk By 池建强”。本书撰写于2013年,书中时间线却不止于此。作者以一个70 后程序员的笔触,立于Mac 之上,讲述技术与人文的故事,有历史,有明天,有技术,有人生。70 多篇文章划分为六大主题:Mac、程序员与编程、科技与人文、人物、工具、职场。篇篇独立成文,可拆可合,随时阅读。 此外,作者还对原来......一起来看看 《MacTalk 人生元编程》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具