【问题标题】:Socket server crashing with unhandled exception套接字服务器因未处理的异常而崩溃
【发布时间】:2011-02-22 07:36:41
【问题描述】:

我们有一个 c#(3.5 框架)套接字服务器,它是一个控制台应用程序,在大约 3000 个连接(或更少,这是相当随机的)之后,我们得到一个未处理的异常,该异常使应用程序完全崩溃。

我们真的很难找出发生了什么以及在哪里,我们得到的唯一信息如下,任何人都可以解释一下吗?需要注意的是,一切都包含在 try catch{}

说明: 停止工作

问题签名: 问题事件名称:CLR20r3 问题签名 01:qrushrserver.exe 问题签名 02:1.0.0.0 问题签名 03:4bf56a0c 问题特征 04:系统 问题签名 05:2.0.0.0 问题签名 06:49cc5ec9 问题签名 07:2c0b 问题签名 08: 40 问题签名 09:System.Net.Sockets.Socket 操作系统版本:6.0.6002.2.2.0.1296.17 区域 ID:2057

故障应用程序 app_name.exe,版本 1.0.0.0,时间戳 0x4bf56a0c,故障模块 mscorwks.dll,版本 2.0.50727.4200,时间戳 0x4a9ee32d,异常代码 0xc0000005,故障偏移量 0x00000000001c89ca,进程 ID 0x%9,应用程序启动时间0x%10。

.NET 运行时版本 2.0.50727.4200 - 致命的执行引擎错误 (000007FEF8E4664E) (80131506)

【问题讨论】:

  • 哇,这似乎是一个严重的崩溃 :-) 你试过google.com/…
  • 您使用的是哪个套接字 API(同步、开始/结束、异步)?

标签: c# .net sockets


【解决方案1】:

您的程序因访问冲突而死亡。虽然没有确凿的证据,但这很可能发生在垃圾收集器或终结器线程运行时。这将使异常无法捕获。

这几乎总是由堆损坏引起的。 非常不太可能是 .NET Socket 代码导致损坏,该代码已经过数十亿次的测试。虽然你正在给它一个很好的锻炼。更可能的原因是您的程序使用了某种非托管代码。某种 COM 服务器,也许你 P/Invoke 一些东西。它也可能是机器的某种插件,例如病毒扫描程序。

找到真正的原因将很困难。从环境开始,在网络支持的安全模式下启动 Windows。运行 SysInternals 的 AutoRuns 实用程序来禁用自动启动的东西。祝你好运,你会需要它。

【讨论】:

  • 我们没有 P/Invoking 任何东西,我们使用的是纯 .NET 类。我们正在考虑安装 mscorwks.dll 的 .net 修补程序。烦人的我们需要卸载所有的框架,然后重新应用它们。感谢您的回复,这听起来像是一场噩梦!
  • 这不是我推荐的,请重新阅读我的最后一段。从病毒扫描程序开始,它们因连接到套接字以“保护”机器而臭名昭著。赛门铁克和 Panda 的历史特别糟糕。
  • 我们的服务器上实际上没有任何病毒扫描程序。
  • 这是修复程序,不知道这是否与我们的问题有关:support.microsoft.com/kb/913384/en-us
  • @Rob:没有。该修补程序的修订版本号是 63,42 号的补丁是 .NET 2.0 的原始发布版本。您在那台机器上的修订版是 4200,在该修补程序之后大约 3 年发布。您可以期望的最好结果是它会拒绝安装。
【解决方案2】:

我猜你使用的是 Async 方法而不是 Begin/End。

当你完成他们的工作后,你是否在你的SocketAsyncEventArgs 上打电话给Dispose()?我发现如果您不这样做并继续分配新的,那么您出于某种原因咀嚼内存,它们似乎没有被收集......我发现这是一个真正的问题,因为大量的读/写操作在高连接数。

【讨论】:

  • 我们正在使用连接池,因此对它们调用 Dispose() 对我们来说不是正确的行为,我们只需关闭套接字,然后将其推回堆栈。还是我们也应该丢弃它?
  • 您的SocketAsyncEventArgs 是“每次操作”数据...在读取或写入完成后您如何处理它们?我发现处理它们并为每个操作创建新的连接对于大量连接比池化以供重用和由此产生的池锁争用更有效。
  • Len,你能不能请一个快速的屠夫了解我们目前正在做的事情。我知道这个线程的主题,但由于某种原因,我有时可以尝试几次成功登录,但我找不到问题。 95.131.67.163/code.txt 非常感谢!
  • 我看到您基于 MSDN 示例;我发现随着时间的推移不可靠(经过一段时间的大量连接和大量数据传输后,由于某种我懒得寻找的原因,性能急剧下降)所以我去掉了整个聪明的内存管理和缓冲池......
  • 确实,认为 MSDN 示例不会出错。显然错了。好的,我们将剥离管理池并使用更简单的模型。其他一切看起来都对吗?出于某种原因,在使用少数客户端进行本地测试时,字典中的客户端数量是正确的,但是在具有更多连接的生产环境中,它似乎有相当多的数量。我们确实有漂移插座,但如果一切都归结于此,我会感到惊讶。我猜可能需要设置一个计时器来检查已处理的套接字..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2023-03-14
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
相关资源
最近更新 更多