我遇到这个问题有一段时间了,不知道如何解决它。
该应用程序实际上是在 2013 年编码 VB.NET DLL,使用 .NET Framework 4.6.1 编译,用于通过 TCP 端口进行消息交换。
DLL 在 Win2012R2 中加载并运行,具有 .NET Framework 4.5 。DLL 运行良好,在 TCP 端口连接时没有问题。
但是,在重试打开TCP端口一段时间后,DLL崩溃了(在我记录的日志文件中,重试计数达到1000 +次)。
我试图寻找根本原因,我发现clr.dll
是导致崩溃的主要原因。在其他文章中,我找到了一些信息,但似乎与我的不太相似......
下面是 Windows 事件日志供您参考。 我想知道是否有人遇到过这个问题并解决了它,请告诉我。
日志名称:应用程序
源:应用程序错误日期:
4/5/2018 2:23:48 AM 事件 ID:1000 任务类别:(100
)
级别:错误
关键字:经典 用户:
不适用 计算机:
服务器11 说明:错误 应用程序名称:MyProgram.exe,版本:
7.8.0.30,时间戳:
0x5984af0d
错误模块名称:clr.dll,版本:4.7.2053.0,时间戳:
0x58fa6bb3 异常代码:0xc00000fd
错误偏移:0x0045138d
错误进程 ID:0x1e04
错误应用程序启动时间:0x01d3cc2fb84774be
错误应用程序路径:MyProgram.exe
错误模块路径:C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
报告 ID:ef43e05d-382c-11e8-80bf-000c291e7679
错误包全名:错误包相对应用程序 ID:
从外观上看,异常代码0xc00000fd
是一个StackOverflow 异常。
这可能是因为递归或许多其他问题。 但是我的钱在递归上。
由于它可能是StackOverflow Expception,我认为您需要调试该过程才能正确捕获它。
从 2.0 开始,堆栈溢出异常只能在 以下情况。
- CLR 在托管环境中运行,在该环境中,主机专门允许处理 StackOverflow 异常
堆栈溢出- 异常是由用户代码引发的,而不是由于实际的堆栈溢出情况(参考)
源 C# 捕获堆栈溢出异常
这也值得一读 什么时候可以捕获 StackOverflowException?
简而言之,我怀疑这是 .net 本身的错误,很可能是由于您(或其他人)正在做的事情,因为您没有显示代码,我们可以假设您/他们做错了什么。
一些良好做法是
- 当连接失败时,不要使用递归做任何愚蠢的事情。
- 确保您始终处理和清理
TcpClient
或使用using
语句 - 如果您尝试同时执行操作
TcpClient
,请确保您没有使用Parallel.For/ForEach
或任何不适合IO 绑定操作的东西,而是使用async
/await
模式(尽管这可能不是问题,但它的好建议)。 - 不要盲目使用别人的图书馆
祝你好运