锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C++开源心得 / X64环境下0xC000041D用户回调期间遇到未经处理的异常
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品开源,禁止转载和任何形式的非法内容使用,违者必究


X64环境下0xC000041D用户回调期间遇到未经处理的异常


背景

notepad.exe 中的 0x000007fee9fc45a8 (darhan.ime) 处有未经处理的异常: 0xC000041D: 用户回调期间遇到未经处理的异常。
回调异常

出问题的代码行为:LRESULT lret = pInput->WindowProc(message, wParam, lParam);

很明显这是个窗口函数,在窗口函数里一般是不会有自己的变量的,但怎么会报异常呢?首次遇到这样的问题,并且是32位环境下不出,只在64位环境下才出,以前的分析堆栈问题的经验用不上,很是压力大。只得用最原始的排查法了。

排查过程

把新内核放到64位环境下好的项目下,设置界面打开时就出上面的错误,看来就是内核的事,也有可能Handler的事。
不包含头文件,全部注释了没事,肯定是头文件里什么代码有影响,但不是类里,因为没用类。
把几个MB结构体删除了可以了。LJMbRow有问题。
发现有#pragma pack(push, 1),删除了不报错, 但旧版本有这个啊。64位release可执行文件也报错。

再找旧版本代码,发现有 #pragma pack(pop),把它移植到新版本里,问题解决。

总结:少移植#pragma pack(pop)就导致出错。

心得

在有版本控制时,才好解决问题。

有些觉得无关的代码行,只要不多加功能,能留着就留着,比如这里的#pragma pack(pop),旧版本里有,新版本里没有,才导致的问题。所以不要手残,多操作。

MSDN里的内容也没说2者要配对使用,当程序员真累啊!

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内