堆栈溢出0xc0000409无法捕捉 如何定位错误原因?

尼古拉斯赵六 2017-02-09 10:34:46
主程序为WPF 调用了若干个第三方库 也都是面向.net的DLL
我的业务流程基本都加了try...catch 而且也使用了如下的代码全局捕捉异常

Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; //UI
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; //THREAD


但是 程序运行了一段时间后 就很容易崩溃 全局异常也没有触发 错误代码是0xc0000409 如图


我用vs2015使用debug模式运行 若干小时后 程序报错 但VS无法定位程序报错原因和位置 VS输出内容为:


程序“[3704] Super.vshost.exe: 程序跟踪”已退出,返回值为 0 (0x0)。
程序“[3704] Super.vshost.exe”已退出,返回值为 -1073740791 (0xc0000409)。


如果分不够可以再追加 求解 谢谢
...全文
6645 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
代冲 2019-12-10
  • 打赏
  • 举报
回复
引用 7 楼 以专业开发人员为伍 的回复:
[quote=引用 2 楼 assicen 的回复:]
[quote=引用 1 楼 caozhy 的回复:]
第三方库是c++写的么?放在一起调试。底层错误框架不一定能catch


第三方库是.net的

调试的时候 是放在一起调试的 就是正常的运行环境 所有的加载项都是加载的情况下调试的 依然捕捉不到错误


因为c#环境下 是.net框架管理内存 我是不参与内存的创建和释放的 但依然出现内存泄露 为什么?[/quote]

这种质量,靠工程素质来保障,不靠什么别的东西。[/quote]经常看到你给人回复,真幸苦,但是每次回复的内容就是装逼,一直在装逼,给人解决不了一点实际问题,看见你就想骂
足球中国 2017-02-11
  • 打赏
  • 举报
回复
程序完全是用.net写的嘛?这样的错误一般是为NULL没做判断引起的底层的调用错误。 如果方便,你可以把程序发上来看看。
尼古拉斯赵六 2017-02-11
  • 打赏
  • 举报
回复
引用 18 楼 zanfeng 的回复:
[quote=引用 17 楼 assicen 的回复:] [quote=引用 16 楼 zanfeng 的回复:] 试试我的这个。http://download.csdn.net/detail/zanfeng/9479986 运行方式,在配置文件里改为你的程序名称。打开程序 代码很短。
感谢 我看一下 顺便能否说一下这个程序的原理呢?[/quote] 代码就几行。你可以看下。原理是根据进程退出时返回的东东看的。不一定管用,你试试吧[/quote] 也截取不到异常.......
尼古拉斯赵六 2017-02-11
  • 打赏
  • 举报
回复 2
已经解决了 第三方库有对c++的调用 因为没有使用stdcall约定 造成了堆栈不平衡导致内存溢出 感谢各位
尼古拉斯赵六 2017-02-10
  • 打赏
  • 举报
回复
感谢各位回帖
引用 3 楼 Chinajiyong 的回复:
看一下windows事件日志什么错误,
这类错误在WINDOWS日志中是查不到的 .net runtime的错误没有这个进程的任何消息
引用 4 楼 closurer 的回复:
你在业务处理加了 try catch 捕获异常后,全局的捕获就不起作用的。 异常是从调用栈的顶部一路抛出的,中间任何一帧捕获了,栈底的全局捕获就无法实现。 你应该删除业务处理中的 try catch 结构,如果不能删除,又想在全局捕获这个异常,那么你要在 catch 块里面写一个 throw
我顶楼的帖子中描述的问题 try...catch和全局异常都不能捕捉到
引用 5 楼 sp1234 的回复:
首先,软件在发布之前,在几万、几十万次地测试(并且可能进入调试)时期,不应该使用 try...catch,应该让所有的异常尽早调出来,而不是掩盖异常带病工作造成恶性循环(最后连环境都崩溃了,或者最后完全是胡乱的运行结果)。 其次,在你你能够把大量 bug 及时捕获而不是用 try...catch 跳过去之后,你再来报 bug 就比较靠谱了。此时剩下的很难遇到的底层 bug,你可以采用日志的方式,通过几步来确定其出错的具体语句。实际上并没有什么“银弹”给你用,你能从细节上做好测试,那么此时你遇到 bug 时才往往立刻就知道了原因,而不需要预先知道原因。 如果稀里糊涂地报 bug,这往往说明这个人习惯于用 try...catch 掩盖错误,他自己无法定位的问题是自己完整的工程思路决定的。
try...catch的目的不是为了掩盖错误,你断章取义了,每个catch中 都有详细的log记录,并且在灾难发生时,程序会重启自身,并且自动生成minidump,这种方式在调试阶段,是为了在小规模(>100)测试时,取得到更多的错误样本。如果每个测试机crash后附加调试器或者生成dump,先不说你有没有这个体力,公司也不会给你这么多时间。 我同样也没要求什么银弹,相反,我更希望知道why?原因是什么?其他人遇到这样问题是如何解决的?我有没有什么可以借鉴的地方?我该如何杜绝这样的情况发生 你说的一些东西很对 但我人为你应该去和新手说。
尼古拉斯赵六 2017-02-10
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
第三方库是c++写的么?放在一起调试。底层错误框架不一定能catch
第三方库是.net的 调试的时候 是放在一起调试的 就是正常的运行环境 所有的加载项都是加载的情况下调试的 依然捕捉不到错误 因为c#环境下 是.net框架管理内存 我是不参与内存的创建和释放的 但依然出现内存泄露 为什么?
threenewbee 2017-02-10
  • 打赏
  • 举报
回复
第三方库是c++写的么?放在一起调试。底层错误框架不一定能catch
Poopaye 2017-02-10
  • 打赏
  • 举报
回复
调试>异常 全勾上
足球中国 2017-02-10
  • 打赏
  • 举报
回复
引用 17 楼 assicen 的回复:
[quote=引用 16 楼 zanfeng 的回复:] 试试我的这个。http://download.csdn.net/detail/zanfeng/9479986 运行方式,在配置文件里改为你的程序名称。打开程序 代码很短。
感谢 我看一下 顺便能否说一下这个程序的原理呢?[/quote] 代码就几行。你可以看下。原理是根据进程退出时返回的东东看的。不一定管用,你试试吧
  • 打赏
  • 举报
回复
引用 2 楼 assicen 的回复:
[quote=引用 1 楼 caozhy 的回复:] 第三方库是c++写的么?放在一起调试。底层错误框架不一定能catch
第三方库是.net的 调试的时候 是放在一起调试的 就是正常的运行环境 所有的加载项都是加载的情况下调试的 依然捕捉不到错误 因为c#环境下 是.net框架管理内存 我是不参与内存的创建和释放的 但依然出现内存泄露 为什么?[/quote] 这种质量,靠工程素质来保障,不靠什么别的东西。
  • 打赏
  • 举报
回复
大部分编程错误,其实不是什么靠与程序开发无关的“银弹”来给你解决的。如果你想要银弹,请你掏出相当于做10次飞机的价钱,别人也许给你免费从互联网上下载一个软件、改改界面,骗你这个钱。你贴出的这个画面就是类似这种需求,当然你是在免费论坛上到处去问,想不花钱就做飞机吃霸王餐,而自己不提高开发测试水平。 开发中要写100个测试用例,每天都自动回归执行几万,当你写几十分钟代码时你就应该增加一些测试用例。这样一旦有 bug,你往往不怎么调试分析,就意识到原因了。出了问题,这样的人即使最差劲地开发者,也能知道出错的语句是哪一条。因为他有自己写测试的这个素质和习惯了
  • 打赏
  • 举报
回复
首先,软件在发布之前,在几万、几十万次地测试(并且可能进入调试)时期,不应该使用 try...catch,应该让所有的异常尽早调出来,而不是掩盖异常带病工作造成恶性循环(最后连环境都崩溃了,或者最后完全是胡乱的运行结果)。 其次,在你你能够把大量 bug 及时捕获而不是用 try...catch 跳过去之后,你再来报 bug 就比较靠谱了。此时剩下的很难遇到的底层 bug,你可以采用日志的方式,通过几步来确定其出错的具体语句。实际上并没有什么“银弹”给你用,你能从细节上做好测试,那么此时你遇到 bug 时才往往立刻就知道了原因,而不需要预先知道原因。 如果稀里糊涂地报 bug,这往往说明这个人习惯于用 try...catch 掩盖错误,他自己无法定位的问题是自己完整的工程思路决定的。
闭包客 2017-02-10
  • 打赏
  • 举报
回复
你在业务处理加了 try catch 捕获异常后,全局的捕获就不起作用的。 异常是从调用栈的顶部一路抛出的,中间任何一帧捕获了,栈底的全局捕获就无法实现。 你应该删除业务处理中的 try catch 结构,如果不能删除,又想在全局捕获这个异常,那么你要在 catch 块里面写一个 throw
EnForGrass 2017-02-10
  • 打赏
  • 举报
回复
看一下windows事件日志什么错误,
尼古拉斯赵六 2017-02-10
  • 打赏
  • 举报
回复
引用 16 楼 zanfeng 的回复:
试试我的这个。http://download.csdn.net/detail/zanfeng/9479986 运行方式,在配置文件里改为你的程序名称。打开程序 代码很短。
感谢 我看一下 顺便能否说一下这个程序的原理呢?
足球中国 2017-02-10
  • 打赏
  • 举报
回复
引用 15 楼 assicen 的回复:
上述的办法基本上都试了一下 去掉了所有的try...catch后 程序运行正常 没有任何问题 但2-4个小时后 会出现顶楼一样的错误 依然无法捕获到异常 只有unknown software exception 0xc0000409的错误提示 我用windbg生成了dump文件,并且放在相应版本的pdb文件中分析 vs2015无法还原错误现场 只有汇编码 而且断点是在系统dll上 我的调用入口只有一个 main函数 感觉没什么意义. 后来我发现用vs2015的debug模式下 WINDOWS事件日志会有如下记录

错误应用程序名称: Super.vshost.exe,版本: 14.0.23107.0,时间戳: 0x559b788a
错误模块名称: clr.dll,版本: 4.6.1586.0,时间戳: 0x575a139f
异常代码: 0xc0000409
错误偏移量: 0x00561437
错误进程 ID: 0x414
错误应用程序启动时间: 0x01d2835b081b32d3
错误应用程序路径: E:\WORK\Android\Super\bin\Debug\Super.vshost.exe
错误模块路径: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
报告 ID: 82d626ef-1e95-48dc-a4f8-794a0ebe30d6
错误程序包全名: 
错误程序包相对应用程序 ID: 
这些信息有帮助吗?
试试我的这个。http://download.csdn.net/detail/zanfeng/9479986 运行方式,在配置文件里改为你的程序名称。打开程序 代码很短。
尼古拉斯赵六 2017-02-10
  • 打赏
  • 举报
回复
上述的办法基本上都试了一下 去掉了所有的try...catch后 程序运行正常 没有任何问题 但2-4个小时后 会出现顶楼一样的错误 依然无法捕获到异常 只有unknown software exception 0xc0000409的错误提示 我用windbg生成了dump文件,并且放在相应版本的pdb文件中分析 vs2015无法还原错误现场 只有汇编码 而且断点是在系统dll上 我的调用入口只有一个 main函数 感觉没什么意义. 后来我发现用vs2015的debug模式下 WINDOWS事件日志会有如下记录

错误应用程序名称: Super.vshost.exe,版本: 14.0.23107.0,时间戳: 0x559b788a
错误模块名称: clr.dll,版本: 4.6.1586.0,时间戳: 0x575a139f
异常代码: 0xc0000409
错误偏移量: 0x00561437
错误进程 ID: 0x414
错误应用程序启动时间: 0x01d2835b081b32d3
错误应用程序路径: E:\WORK\Android\Super\bin\Debug\Super.vshost.exe
错误模块路径: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
报告 ID: 82d626ef-1e95-48dc-a4f8-794a0ebe30d6
错误程序包全名: 
错误程序包相对应用程序 ID: 
这些信息有帮助吗?
正怒月神 2017-02-10
  • 打赏
  • 举报
回复
去掉 try catch看原因
绿领巾童鞋 2017-02-10
  • 打赏
  • 举报
回复
看看目录下面有没有dmp文件,有的话给c++的分析一下
  • 打赏
  • 举报
回复
很可能还是非托管库报的错,面向.Net不代表就是完全托管的,像Sqlite.Net,给你的是托管的,但它内部会用到非托管的核心库 SQLite.Interop.dll 在某些阉割版的xp上就跑不起来,报的错跟你的类似。后来发现那版本的库需要Visual C++ 2005 SP1 runtime这么老的运行时,VC 2008和10的都跑不起来
加载更多回复(2)
内容概要:本文研究了基于Q-Learning自适应强化学习的PID控制器在自主水下航行器(AUV)运动控制中的应用,旨在提升其在复杂海洋环境下的控制性能。通过建立AUV的动力学模型,将Q-Learning算法与传统PID控制相结合,实现控制器参数的在线自适应优化,有效增强了系统的响应速度、稳定性和抗干扰能力。研究采用Matlab进行仿真验证,结果表明该方法在轨迹跟踪与姿态控制方面具有优越表现,为水下机器人智能控制提供了可行的技术路径与理论支持。; 适合人群:具备自动控制理论、强化学习或水下机器人建模背景,从事相关科研工作的研究人员、高校研究生及工程技术开发者。; 使用场景及目标:①应用于高精度、强鲁棒性的水下机器人运动控制系统设计;②开展智能PID控制器在非线性、时变系统中的参数自整定研究;③作为强化学习在复杂工业控制场景中落地的典型案例参考,推动算法与工程实践融合。; 阅读建议:建议结合提供的Matlab代码进行仿真实验,重点剖析Q-Learning与PID融合的架构设计、奖励函数设定及参数收敛过程,可进一步拓展至与其他智能优化算法(如DQN、Actor-Critic)的对比研究,深化对自适应控制机制的理解。
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 Matlab 被视为一种功能卓越的编程平台,特别是在数值运算和数据分析方面展现出广泛的应用价值。在应对多元非线性回归的挑战时,Matlab 拥备多种工具和函数,支持用户对复杂的数据进行构建模型和适配。本指南将重点阐释在 Matlab 环境下如何执行多元非线性回归分析。 我们需要掌握三种关键的回归指令: 1. `polyfit(x,y,n)`:此函数适用于拟合一元幂函数,能够导出一个多项式模型。例如,若知晓数据呈现二次函数形态,可选择`n=2`来适配一个二次曲线。 2. `regress(y,x)`:这是一个多元线性回归指令,能够处理多个自变量对因变量的影响。即便数据并非完全呈现线性特征,该函数也能提供一个线性近似。 3. `nlinfit(x,y,’fun’,beta0)`:这是最为通用的非线性回归指令,适用于适配任何类型的函数,无论是一元或多元,前提是用户能够定义函数形式(`fun`参数)。 回归分析的核心在于寻找一组最优的系数,使得模型能够最恰当地描述数据。这通常涉及选择一个合适的函数形态,随后通过最小化误差平方和来估算系数。在Matlab中,`regress`指令主要用于处理线性模型,而`nlinfit`则处理更为复杂的非线性模型。 对于多元线性回归模型,我们可以用如下形式进行表述: \[ y = \beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_px_p + \epsilon \] 其中,\( y \)是因变量,\( x_1, x_2, \ldots, x_p \)是自变量,\( \beta_0, \beta_1, ...
内容概要:本文系统阐述了基于BP神经网络的语音特征信号分类方法,并提供了完整的Matlab代码实现。研究围绕语音信号的数据预处理、特征提取、神经网络结构设计、模型训练与分类测试等核心环节展开,详细展示了BP神经网络在语音识别任务中的应用流程。通过构建多层前馈网络模型,利用误差反向传播算法优化权重,实现了对不同语音类别特征的高效分类,具有较强的工程实践价值和技术可复现性。; 适合人群:具备信号处理与机器学习基础知识,熟悉Matlab编程语言,从事语音识别、模式识别、人工智能等相关领域研究的学生及科研人员;特别适用于开展课程设计、毕业设计或科研项目的初级与中级研究人员。; 使用场景及目标:①深入理解BP神经网络的基本原理及其在语音信号分类中的具体实现过程;②掌握Matlab环境下语音信号特征提取与分类模型构建的全流程技术;③为语音识别、人机交互、智能听觉系统等实际应用场景提供可靠的算法基础与代码参考。; 阅读建议:建议读者结合所提供的Matlab代码逐行分析其实现逻辑,重点关注数据输入格式、网络参数初始化、训练迭代过程及分类性能评估;可通过调整隐含层节点数、学习率、激活函数等超参数,观察模型收敛性与分类准确率的变化,从而深化对神经网络调参策略的理解。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧