我有一个基于 .Net 的网站,其中一个功能在生产服务器上陷入僵局。我无法重现开发中的问题。但是我有一个迹象可以很容易地检测到是否发生了死锁,那就是线程数开始从“正常”的 50 增加到 100 以上。
所以我想做的是在线程数超过 100 时以某种方式将信息转储到文件中。信息可能是堆栈跟踪、在线程上下文中运行的对象等。任何可能导致我找到源的东西问题。
我尝试添加简单的日志记录,但在生产中记录它的成本很高。
这有可能从正在运行的站点完成吗?该站点在带有 .Net 3.5 的 IIS 中运行。
我有一个基于 .Net 的网站,其中一个功能在生产服务器上陷入僵局。我无法重现开发中的问题。但是我有一个迹象可以很容易地检测到是否发生了死锁,那就是线程数开始从“正常”的 50 增加到 100 以上。
所以我想做的是在线程数超过 100 时以某种方式将信息转储到文件中。信息可能是堆栈跟踪、在线程上下文中运行的对象等。任何可能导致我找到源的东西问题。
我尝试添加简单的日志记录,但在生产中记录它的成本很高。
这有可能从正在运行的站点完成吗?该站点在带有 .Net 3.5 的 IIS 中运行。
您还可以尝试Microsoft 的ProcDump,它可以根据性能计数器的值(例如线程数)有条件地生成进程转储。这是文档给出的示例:
示例:当 Outlook 的句柄计数超过 10000 时,写入名为“outlook”的进程的转储:
C:>procdump outlook -p "\Process(Outlook)\Handle Count" 10000
在您的情况下,您将指定“线程计数”而不是“句柄计数”,您的值将是 100 而不是 10,000。
而且由于您运行的是 IIS,我认为进程名称是 w3wp 或类似名称(使用它而不是“Outlook”)。
此外,由于此进程正在运行托管代码,因此您还必须指定“-ma”开关以获得完整转储,这是您检查托管进程转储所需的。
如果在站点上安装了 Visual Studio 远程调试器,则可以在远程系统上远程检查软件的状态,同时它仍在运行。