由于Microsoft.NET \ Framework \ v4.0.30319 \ clr.dll,应用程序(VB.Net)崩溃。尝试调用TcpClient.Connect(IP)API 1000次后

时间:2018-04-12 05:41:56

标签: c# .net vb.net

我暂时面对这个问题并且不知道如何解决它。

该应用程序实际上是一个用.NET Framework 4.6.1编译的VB编译的DLL,用于通过TCP端口进行消息交换。

使用.NET framework 4.5在Win2012R2中加载并运行DLL。当TCP端口连接时,DLL运行良好而没有问题。

但是,重试打开TCP端口一段时间后,DLL崩溃了(在我记录的日志文件中,重试次数达到了1000次以上)。

我试图寻找根本原因,我发现{{1}}是导致崩溃的主要原因。在其他文章中,我发现了一些信息,但似乎与我的相似...

以下是Windows事件日志供您参考。 我想知道是否有人遇到过这个问题并解决了,请告诉我。

  

日志名称:申请
  来源:申请错误
  日期:4/5/2018 2:23:48上午   事件编号:1000
  任务类别:(100)
  等级:错误
  关键词:经典
  用户:N / A
  计算机:Server11
  说明:
  错误应用程序名称: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
  报告编号:ef43e05d-382c-11e8-80bf-000c291e7679
  错误包全名:
  错误的包相关应用程序ID:

1 个答案:

答案 0 :(得分:2)

从外观上看,异常代码0xc00000fd StackOverflow Exception

这可能是因为递归或许多其他问题。但是我的钱是递归的。

由于它可能是 StackOverflow Expception ,我认为您需要调试该过程才能正确捕获它。

  

从2.0开始,StackOverflow异常只能被捕获   以下情况。

     
      
  • CLR正在托管环境中运行,其中主机特别允许处理StackOverflow异常
  •   
  • 用户代码抛出stackoverflow异常,而不是由于实际的堆栈溢出情况(参考)
  •   

来源C# catch a stack overflow exception

这也值得一读When can you catch a StackOverflowException?

简而言之,我怀疑这是.net自身的错误,很可能是由于你正在做什么(或其他人),因为你没有展示代码我们可以假设你/他们正在做什么出了点问题。

一些好的做法是

  • 当连接失败时,不要使用递归来做任何愚蠢的事情。
  • 确保始终处理和清理TcpClient或使用using声明
  • 如果您尝试与TcpClient同时执行操作,请确保您没有使用Parallel.For/ForEach或任何不适合 IO Bound 操作的内容,而是使用async / await模式(虽然这可能不是问题,但它的建议很好)。
  • 不要盲目使用其他人的图书馆
祝你好运