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

assicen 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)。


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


第三方库是.net的

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


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

这种质量,靠工程素质来保障,不靠什么别的东西。[/quote]经常看到你给人回复,真幸苦,但是每次回复的内容就是装逼,一直在装逼,给人解决不了一点实际问题,看见你就想骂
足球中国 2017-02-11
  • 打赏
  • 举报
回复
程序完全是用.net写的嘛?这样的错误一般是为NULL没做判断引起的底层的调用错误。 如果方便,你可以把程序发上来看看。
assicen 2017-02-11
  • 打赏
  • 举报
回复
引用 18 楼 zanfeng 的回复:
[quote=引用 17 楼 assicen 的回复:] [quote=引用 16 楼 zanfeng 的回复:] 试试我的这个。http://download.csdn.net/detail/zanfeng/9479986 运行方式,在配置文件里改为你的程序名称。打开程序 代码很短。
感谢 我看一下 顺便能否说一下这个程序的原理呢?[/quote] 代码就几行。你可以看下。原理是根据进程退出时返回的东东看的。不一定管用,你试试吧[/quote] 也截取不到异常.......
assicen 2017-02-11
  • 打赏
  • 举报
回复 2
已经解决了 第三方库有对c++的调用 因为没有使用stdcall约定 造成了堆栈不平衡导致内存溢出 感谢各位
assicen 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?原因是什么?其他人遇到这样问题是如何解决的?我有没有什么可以借鉴的地方?我该如何杜绝这样的情况发生 你说的一些东西很对 但我人为你应该去和新手说。
assicen 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事件日志什么错误,
assicen 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 运行方式,在配置文件里改为你的程序名称。打开程序 代码很短。
assicen 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)

111,093

社区成员

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

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

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