【问题标题】:How to do a thread dump on Azure App Service?如何在 Azure 应用服务上进行线程转储?
【发布时间】:2025-12-25 19:55:16
【问题描述】:

我有一个运行 Tomcat 8.5 的 Azure 应用服务,但似乎不知道如何进行线程转储。控制台和 DebugConsole 都无法识别 jstack。

【问题讨论】:

  • 也许是 Kudu 控制台?

标签: java azure tomcat tomcat8


【解决方案1】:

受上一个答案的启发,我创建了以下 bat 脚本(我想可能是 powershell)来完成这项工作:

powershell -Command "get-process java |select -expand id" > pid.txt
set /p id= < pid.txt
"%JAVA_HOME%\bin\jstack" -F %id% > out.txt

它使用您在应用程序中使用的 java 版本 (JAVA_HOME),不需要您提供任何输入。这很简单并且可以解决问题。例如,只需在您的 wwwroot 中创建一个 bat 文件,然后随时运行即可。

【讨论】:

    【解决方案2】:

    在 Azure 应用服务上,所有流行的 Java 版本都安装在路径 D:\Program Files (x86)\Java。以1.8.0u73版本为例,如下图。

    您可以通过 Kudu 控制台工具命令set PATH=D:\Program Files (x86)\Java\jdk1.8.0_73\bin;%PATH% 临时将 Java 工具添加到环境中。然后,jstack 工具在当前 Kudu 会话中可用。

    【讨论】:

    • 使用您的答案,我在进程资源管理器选项卡中使用 java 进程中的 pid 尝试了 jstack,但我得到一个“线程中的异常”main“java.io.IOException:过早的 EOF”。这可能是我的特定应用程序的问题,所以您能否验证您实际上可以通过这种方式进行线程转储?
    • @DaveyChu 您的异常似乎是由jstack 产生的巨大内容引起的。请尝试jstack -F PID &gt; D:\home\site\out.txt 将内容输出到文本文件。