我在生产机器上遇到一种情况,我的Windows服务中的线程似乎只是死了,没有抛出异常。到目前为止,我的日志记录还不够精确,无法确定其死亡的确切代码行;为此,我已经部署了一个带有更详细日志记录的新版本。但是在我拿到一支冒烟的枪之前,我的怀疑落在我创建新数据库环境的代码行上。
错误是不可预测的,除了它往往发生在高活动期间,并且经常与其他线程相关,导致数据库超时异常(因此我怀疑上面)。我可以处理的例外情况。死线我不能。
任何想法为什么线程可能会无声地死亡,或者只是冻结?或者该怎么办?
编辑:要清楚,代码被try-catch块包围,catch会执行一些日志记录(使用log4net)。 "最后"也是如此。我知道它正在工作,因为其他线程在抛出异常时已经离开了日志。我在日志中看到的所有内容都是线程 x 遇到某个调试点,然后再也看不到或听不到它了,它应该做的工作仍然没有完成。
答案 0 :(得分:0)
如果您有权访问系统,我将使用以下方法对其进行调试: Visual Studio 2013远程调试器。如果您无法在开发环境中重现错误,这通常是一个不错的选择。
线程不会以静默方式冻结或崩溃,检查代码中是否有一些空的catch
块,或者它会遇到无限循环(或任何时候超长的超时)。
也许你有一些代码给我们。
答案 1 :(得分:0)
不,不是真的(但有点)。线程不会死,它们会完成。线程可以成功完成或失败 - 如果线程失败,则存储其异常直到处理完毕。根据您实例化线程的方式,您可能会触发并忘记",这意味着如果发生异常,您将无法处理和检索它。这是非常糟糕的,因为它会导致未发布的资源(它们等待您检索和处理异常)。
但是,您尚未提供有关您诊断出的内容的任何详细信息。你使用什么线程方法/框架(那里有很多)?您是否正在观看流程线程并看到它突然消失?您是在进行堆快照,还是在看似已经死亡后附加到正在运行的进程中?