Debugging 旧式第三方应用程序中的调试过程挂起

Debugging 旧式第三方应用程序中的调试过程挂起,debugging,process,freeze,Debugging,Process,Freeze,我们有一个传统的第三方电话系统,它建立在一个叫做CT ADE的东西上,定期挂起5到30秒,然后恢复。在这些挂起期间,用户会在电话菜单中遇到令人沮丧的暂停。这至少已经持续了几个星期 这段代码不是我写的,所以我对它的了解非常有限。内部有多个任务线程?,每个电话线一个,用于处理呼叫。应用程序挂起时,所有任务都挂起 此问题似乎与负载无关。即使在使用率较低的时候也会发生。如果DB与此应用程序位于同一物理框中,则在系统上出现此问题似乎与网络无关。看起来与网络或磁盘无关,但创建执行大量DB I/O和文件I/O

我们有一个传统的第三方电话系统,它建立在一个叫做CT ADE的东西上,定期挂起5到30秒,然后恢复。在这些挂起期间,用户会在电话菜单中遇到令人沮丧的暂停。这至少已经持续了几个星期

这段代码不是我写的,所以我对它的了解非常有限。内部有多个任务线程?,每个电话线一个,用于处理呼叫。应用程序挂起时,所有任务都挂起

此问题似乎与负载无关。即使在使用率较低的时候也会发生。如果DB与此应用程序位于同一物理框中,则在系统上出现此问题似乎与网络无关。看起来与网络或磁盘无关,但创建执行大量DB I/O和文件I/O的示例任务可能会缩短此应用程序中的暂停时间

当问题发生时,进程不会显示任何内存或cpu峰值


在这一点上,我只是抓住任何东西来尝试…

使用遗留代码是痛苦的-根据我的经验,你只需要潜入并尝试通过任何对你有用的方式来理解代码在做什么-无论是通过阅读代码并试图弄清楚它在做什么,或者调试各种场景并逐步完成执行的每一行代码

这将需要一段时间,代码中的某些部分你永远无法理解,但如果有足够的时间盯着代码,并尝试代码的功能,你最终应该能够理解足够的内容,从而找出问题所在


有一本书我从未读过,但我认为它很好。

尝试在其中一次挂起期间运行采样探查器,看看CPU时间花在哪里。

如果问题与高CPU使用率无关,那么配置文件可能不会给您带来任何好处

对我来说,这听起来像是一个多线程问题。如果可能,使用调试器连接,并在出现问题时暂停。查看所有线程当前执行的代码/调用堆栈。可能是多个线程试图访问单个资源或线程安全函数,并且必须等待,因为另一个线程以独占方式访问此资源。
这可能是一些不显眼的事情,比如试图写入日志

所谓遗留,我指的是老化的应用程序。构建在该应用程序之上的自定义代码正在积极维护。不是我,仅供参考。我只是想找出可能的原因来帮助解决这个问题。这也是我的想法,但我们在一些服务器上看到了它,但在其他服务器上看不到。我们不能强迫它发生,它会自行清除,因此附加调试器将非常困难。不过这是个好主意。如果我们能够找到一种复制它的方法,那么调试器将是一个很好的下一步。谢谢。@Matthew-即使如此,采样分析器仍然可能会告诉您,花费的CPU时间很少,是在某种最终超时的死锁中。