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)


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

查看所有标签

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

The Hard Thing About Hard Things

The Hard Thing About Hard Things

Ben Horowitz / HarperBusiness / 2014-3-4 / USD 29.99

Ben Horowitz, cofounder of Andreessen Horowitz and one of Silicon Valley's most respected and experienced entrepreneurs, offers essential advice on building and running a startup—practical wisdom for ......一起来看看 《The Hard Thing About Hard Things》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具