楔子

在对类进行实例化的时候,会调用.Ctor默认构造函数。

它一般的首先调用的是函数

JIT_TrialAllocSFastMP_InlineGetThread

实例化,然后再调用.Ctor。这是一个实例化的整体思路。

问题

问题就出在,如果在VS Debug CLR上的.Ctor的汇编代码上打上断点,那么结果就会出错。如果你不打这个断点。结果就不会出错。错误如下:

意思是,打上断点造成的错误?
继续运行下去整个程序直接结束了。

探究

看下错误堆栈:

KernelBase.dll!00007fff09a088e2()    未知  未加载任何符号。
coreclr.dll!CHECK::Setup(const char * message=0x000002948594b430, const char * condition=0x00007ffe5c48e524, const char * file=0x00007ffe5c492990, int line=0x00001be0) 行 198   C++   已加载符号。
coreclr.dll!CLRVectoredExceptionHandlerPhase3(_EXCEPTION_POINTERS * pExceptionInfo=0x000000ecb6f79bd0) 行 7135  C++   已加载符号。
coreclr.dll!CLRVectoredExceptionHandlerPhase2(_EXCEPTION_POINTERS * pExceptionInfo=0x000000ecb6f79bd0) 行 6889  C++   已加载符号。
coreclr.dll!CLRVectoredExceptionHandler(_EXCEPTION_POINTERS * pExceptionInfo=0x000000ecb6f79bd0) 行 6856    C++   已加载符号。
coreclr.dll!CLRVectoredExceptionHandlerShim(_EXCEPTION_POINTERS * pExceptionInfo=0x000000ecb6f79bd0) 行 7547    C++   已加载符号。
ntdll.dll!RtlpCallVectoredHandlers()    未知  已加载符号。
ntdll.dll!RtlDispatchException()    未知  已加载符号。
ntdll.dll!KiUserExceptionDispatch() 未知  已加载符号。
coreclr.dll!_hpCodeHdr::GetNumberOfUnwindInfos() 行 331  C++   已加载符号。
coreclr.dll!_hpCodeHdr::GetUnwindInfo(unsigned int iUnwindInfo=0x00000000) 行 341   C++   已加载符号。
coreclr.dll!CEEJitInfo::WriteCode(EEJitManager * jitMgr=0x00000294d6bdeba0) 行 10883    C++   已加载符号。

GetNumberOfUnwindInfos()这个函数出现了异常,进去看看,函数原型如下:

UINT  GetNumberOfUnwindInfos()
{SUPPORTS_DAC;return pRealCodeHeader->nUnwindInfos;
}

原来是pRealCodeHeader这个结构体为空造成的异常。那么它是从哪里来的呢?

看堆栈有个WriteCode函数,进入里面看下:

void CEEJitInfo::WriteCode(EEJitManager * jitMgr)
{// 此处省略WriteCodeBytes();、// 此处省略
}

它里面调用了WriteCodeBytes函数:

void CEEJitInfo::WriteCodeBytes()
{if (m_CodeHeaderRW != m_CodeHeader){ExecutableWriterHolder<void>codeWriterHolder((void*)m_CodeHeader,m_codeWriteBufferSize);memcpy(codeWriterHolder.GetRW(), m_CodeHeaderRW, m_codeWriteBufferSize);}
}

m_CodeHeader的成员变量就是pRealCodeHeader。那么m_CodeHeader哪里来的呢?

m_CodeHeader通过codeWriterHolder调用MapViewOfFile进行地址映射,当
codeWriterHolder.GetRW()变量改变的时候,m_CodeHeader就进行改变。那么问题就出在这里,当断点到.Ctor上面的时候,运行到这两句代码:

ExecutableWriterHolder<void> codeWriterHolder((void *)m_CodeHeader, m_codeWriteBufferSize);
memcpy(codeWriterHolder.GetRW(), m_CodeHeaderRW, m_codeWriteBufferSize);

m_CodeHeader并没有改变,而断点其它函数都会改变。

难道是断点引起的MapViewOfFile错误?

结果

原因是找到了,但是解决问题的方式有点不爽。看上面两句代码,变量

codeWriterHolder.GetRW()

通过m_CodeHeaderRW变量赋值了,但是m_CodeHeader并没有被赋值上。所以这里可以把m_CodeHeaderRW地址指向的值八字节一个单位,复制到m_CodeHeader地址指向的值。这样就可以解决问题。

看似解决了问题,实际上为啥赋值不上,是否是MapViewOfFile的原因,或者是个微软的BUG?因为MapViewOfFile不开源,也看不到代码,所以无从查证。

结尾

作者:江湖评谈

一个奇怪的错误,找到了错误点,也找到了解决方法,但是结果不满意相关推荐

  1. 微信二次分享签名错误php,微信二次分享报错invalid signature问题及解决方法

    基于微信公众号开发的h5页面(使用jssdk接口),由用户A分享给用户B,用户B再次分享这个页面时,不能成功分享.问题出在用户B收到的分享链接与用户A打开的链接不同 A用户的链接为 B用户收到的连接 ...

  2. Word2007“由于文件许可权错误,Word无法完成保存操作”问题的解决方法

    Word2007"由于文件许可权错误,Word无法完成保存操作"问题的解决方法操作系统windows xp sp3杀毒软件: 金山毒霸word 2007保存文件提示"由于 ...

  3. Mac 错误提示:zsh: command not found: brew解决方法

    Mac 错误提示:zsh: command not found: brew解决方法@TOC 欢迎使用Markdown编辑器 Mac平台出现brew command not found问题解决方法 错误 ...

  4. dedecms后台报错“Undefined variable cfg_domain_cookie”的解决方法

    dedecms后台报错"Undefined variable cfg_domain_cookie"的解决方法 打开调试模式 Notice: Undefined variable: ...

  5. Duplicate Symbol链接错的原因总结和解决方法

    Duplicate Symbol链接错的原因总结和解决方法 duplicate symbol(符号复制,即有相同的文件名)是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在.但是经过一段时 ...

  6. python--import statsmodels.api as sm报错: cannot import name 'factorial'解决方法

    python--import statsmodels.api as sm报错: cannot import name 'factorial'解决方法 1.统计处理statsmodels包 2. can ...

  7. PADS使用过程中出现“发生严重的运行错误,请按“确认”关闭程序”的解决方法

    PADS使用过程中出现"发生严重的运行错误,请按"确认"关闭程序"的解决方法 在使用Ruter的时候,一旦按下保存就会弹出此窗口,刚开始以为是DRC报错太多了, ...

  8. 台式计算机启动不了,台式机找到u盘但启动不了解决方法

    最近有网友跟windows7之家小编留言说他遇到了台式机找到u盘但启动不了的尴尬问题,其实网友们遇到u盘启动不了这个问题解决起来还是比较简单的.下面小编就把台式机找到u盘但启动不了解决方法分享给大家, ...

  9. word报错打不开的解决方法

    对于办公人员来说,word是日常办公中最常用的软件,根本就是离不开的.但有时需要Word删除表格的保留内容,有时反过来又需要删除Word的保留形式.一旦操作了出现word出现打不开或者出现一些异常现象 ...

  10. android:paddingTop=“@dimen/activity_horizontal_margin“报错(报红)解决方法

    android:paddingTop="@dimen/activity_horizontal_margin"报错(报红)解决方法 在app----->res-----> ...

最新文章

  1. 软件工程导论结对项目
  2. 读后感与机翻《从视频中推断力量和学习人类效用》
  3. 社区发现算法 - Fast Unfolding(Louvian)算法初探
  4. objective-c ——代码块
  5. mysql象限和投影_Camera类之orthographic-摄像机投影模式(第100篇随笔)
  6. Placing a Method with Eval parameter into a DataList
  7. Vue父子组件之间的传值
  8. oracle表的历史数据转储过程,C#连接Oracle数据库通过存储过程操作数据库 - cuizm的专栏 - CSDN博客...
  9. 华为p20支持手机云闪付吗_华为官宣7款旗舰支持升级EMUI10.132系统,你的手机有份吗?...
  10. Log4j(1)--hellloworld
  11. mysql utf8mb4 php_MySQL设置utf8mb4编码_MySQL
  12. [转载]Docker的安装配置及使用详解
  13. android sqlite 打包 xe,Delphi XE使用SQLite3
  14. 车联网仿真测试解决方案
  15. 转:谦逊不是罕见的美德,而是人人可习得的能力
  16. pdf.js上传有盖章文件盖章不显示
  17. 计算机主板与检测,主板知识详解:CPU自动检测和硬件错误的侦测
  18. 解决REFERENCEERROR: primordials is not defined问题
  19. javascript 过滤_功能性JavaScript中的过滤和链接
  20. h5是html语言吗,H5和HTML5是一样的吗

热门文章

  1. R语言计算mae,mape,欧氏距离,rmse
  2. 透过三季度财报看3.0用友:向云而升,做企业数智化的云引擎
  3. https安全解决方案证书certbot教程
  4. 【Vue+Mapbox】Vue中mapbox地图的使用(二)—— 自定义Geojson地图数据
  5. 点乘与叉乘是否满足结合律
  6. 智慧城市系列课程1-总览-系统解读智慧城市的需求及技术
  7. 版本4校园兼职软件遇到的问题和解决方法
  8. oracle中的job定时任务(原地址:http://blog.csdn.net/ysc1123/article/details/50593667)
  9. 大数据挖掘技术之DM经典模型
  10. 机械臂算法中的重要概念与结论总结(不含详细推导)1