dotMemory 2025.2 Help

使用 dotMemory 命令行分析器

您可以使用 dotMemory 命令行分析器分析任何 .NET 或 .NET Core 应用程序(包括已在运行的应用程序)并获取内存快照。

该工具在多种场景下非常有用:

  • 在远程服务器上分析应用程序

    例如,当无法在服务器上安装独立的 dotMemory 时。

  • 自动化内存快照收集过程

    例如,如果您希望将分析作为持续集成构建的一部分:这可以是执行集成测试分析的构建步骤。

  • 加速分析流程

    例如,当您定期分析相同的应用程序且不希望每次都启动 dotMemory 用户界面时。

分发

该工具免费分发为 .zip 压缩包或 NuGet 包(WindowsLinuxmacOS ),无需安装 dotMemory。 您可以将其自由上传到任何计算机以获取问题应用程序的内存快照。

主要分析器命令

  • get-snapshot - 即时获取正在运行应用程序的快照。

  • attach - 将分析器附加到正在运行的应用程序,并根据条件、使用 API 或通过发送命令到 stdin 获取快照。

  • start - 启动应用程序并根据条件、使用 API 或通过发送命令到 stdin 获取快照。

  • start-net-core - 启动 .NET Core 应用程序并根据条件、使用 API 或通过发送命令到 stdin 获取快照。

  • start-iis - (仅限 Windows)启动 IIS 并根据条件、使用 API 或通过发送命令到 stdin 获取快照。

  • start-iis-express - (仅限 Windows)在分析模式下启动托管于 IIS Express 的 Web 应用程序。

  • start-windows-service - (仅限 Windows)在分析模式下(重新)启动托管的 Windows 服务,并根据条件或使用 API 获取内存快照。

  • start-wcf-service - (仅限 Windows)在分析模式下(重新)启动具有指定 WCF 服务库的 WCF 主机,并根据条件或使用 API 获取内存快照。

  • start-winrt - (仅限 Windows)在分析模式下启动 WinRT 应用程序,并根据条件或使用 API 获取内存快照。

  • profile-new-processes - (仅限 Windows)分析在执行此命令后启动的任何托管应用程序。

  • list-iis-express - (仅限 Windows)显示可用的 IIS Express 安装列表。

  • list-wcf-host - (仅限 Windows)显示可用的 WCF 主机列表。

  • list-winrt - (仅限 Windows)显示可用的 WinRT 应用程序列表。

有关特定命令的详细信息,请运行: dotMemory.exe help <command> (Windows), ./dotMemory.sh help <command> (Linux、macOS)。

获取正在运行应用程序的快照

这是最简单且需求量最大的场景。 您只需告诉 dotMemory 您想要分析哪个应用程序。 您可以通过两种方式完成此操作:按应用程序名称或按 PID。

通过其 PID(例如,6844)即时获取正在运行应用程序的快照:

  • 运行命令:

    dotMemory.exe get-snapshot 6844 --save-to-dir=C:\Snapshots

这里:

  • --save-to-dir=C:\Snapshots - (可选)保存快照的目录路径(更准确地说,是工作区 .dmw 文件)。 在这种情况下,快照文件名将自动生成。 如果您想自行指定文件名,请使用 --save-to-file 选项。

  • 6844 - 进程 PID(您可以在 Windows 任务管理器中找到它)。

通过其 PID(例如,6844)即时获取正在运行应用程序的快照:

  • 运行命令:

    ./dotMemory.sh get-snapshot 6844 --save-to-dir=~/Snapshots

这里:

  • --save-to-dir=~/Snapshots - (可选)保存快照的目录路径(更准确地说,是工作区 .dmw 文件)。 在这种情况下,快照文件名将自动生成。 如果您想自行指定文件名,请使用 --save-to-file 选项。

  • 6844 - 进程 PID(您可以使用 ps 系统命令找到它)。

通过其名称即时获取正在运行应用程序的快照

  • 运行命令:

    dotMemory.exe get-snapshot MyApp --with-max-mem

    或者

    dotMemory.exe get-snapshot MyApp --all

这里:

  • MyApp - 进程名称(您可以在 Windows 任务管理器中找到它)。 如果有多个具有此名称的进程,您可以使用 --with-max-mem--all 选项消除歧义。

  • --with-max-mem - 将分析内存消耗最多的进程。

  • --all - 将分析所有具有指定名称的进程。 dotMemory 将获取所有进程的快照(每个进程一个快照)。

通过其名称即时获取正在运行应用程序的快照

  • 运行命令:

    ./dotMemory.sh get-snapshot MyApp --with-max-mem

    或者

    ./dotMemory.sh get-snapshot MyApp --all

这里:

  • MyApp - 进程名称(您可以使用 ps 系统命令找到它)。 如果有多个具有此名称的进程,您可以使用 --with-max-mem--all 选项消除歧义。

  • --with-max-mem - 将分析内存消耗最多的进程。

  • --all - 将分析所有具有指定名称的进程。 dotMemory 将获取所有进程的快照(每个进程一个快照)。

启动应用程序并根据条件获取快照

有时可能需要在较长时间间隔内跟踪应用程序的内存消耗。 在这种情况下,您可以在分析模式下启动应用程序,并仅在满足特定条件时获取快照:周期性时间间隔结束或内存消耗增加到指定值。

启动 MyApp.exe 并定期获取快照

  • 运行命令:

    dotMemory.exe start --trigger-timer=30s C:\MyApp\MyApp.exe MyAppArg1

这里:

  • --trigger-timer=30s - 获取快照的时间间隔(在此示例中为 30 秒)。

  • C:\MyApp\MyApp.exe - 被分析应用程序的可执行文件路径。

  • MyAppArg1 - (可选)MyApp.exe 的参数。 请注意,如果应用程序参数以短横线(-)字符开头,您可以使用双短横线(--)进行转义。 例如:

    dotMemory.exe start --trigger-timer=30s C:\MyApp\MyApp.exe -- -MyAppArg1

启动 MyApp 并定期获取快照

  • 运行命令:

    ./dotMemory.sh start --trigger-timer=30s ~/MyApp/MyApp my-app-arg1

这里:

  • --trigger-timer=30s - 获取快照的时间间隔(在此示例中为 30 秒)。

  • ~/MyApp/MyApp - 被分析应用程序的可执行文件路径。

  • my-app-arg1 - (可选)MyApp 的参数。 请注意,如果应用程序参数以短横线(-)字符开头,您可以使用双短横线(--)进行转义。 例如:

    ./dotMemory.sh start --trigger-timer=30s ~/MyApp/MyApp -- -my-app-arg1

启动 MyApp.exe 并在内存消耗增加到指定值时获取快照

  • 运行命令:

    dotMemory.exe start --trigger-mem-inc=50% --trigger-delay=5s C:\MyApp\MyApp.exe

这里:

  • --trigger-mem-inc=50% - 仅当 MyApp 的内存消耗增加 50% 时才会获取快照。

  • --trigger-delay=5s - 将启用一个触发器,并设置 5 秒的暂停时间以跳过应用程序启动阶段。

启动 MyApp 并在内存消耗增加到指定值时获取快照

  • 运行命令:

    ./dotMemory.sh start --trigger-mem-inc=50% --trigger-delay=5s ~/MyApp/MyApp

这里:

  • --trigger-mem-inc=50% - 仅当 MyApp 的内存消耗增加 50% 时才会获取快照。

  • --trigger-delay=5s - 将启用一个触发器,并设置 5 秒的暂停时间以跳过应用程序启动阶段。

有时,您可能希望在被分析应用程序启动后立即获取快照。 例如,您可以将此快照用作比较的基础。

启动 MyApp.exe 并在分析器初始化后立即获取快照

  • 运行命令:

    dotMemory.exe start --trigger-on-activation C:\MyApp\MyApp.exe

这里:

  • --trigger-on-activation - 一旦分析器初始化完成,将立即获取快照。 请注意,如果设置了 --trigger-delay--trigger-on-activation 将等待此延迟。

启动 MyApp 并在分析器初始化后立即获取快照

  • 运行命令:

    ./dotMemory.sh start --trigger-on-activation ~/MyApp/MyApp

这里:

  • --trigger-on-activation - 一旦分析器初始化完成,将立即获取快照。 请注意,如果设置了 --trigger-delay--trigger-on-activation 将等待此延迟。

使用 stdin 消息启动应用程序并获取快照

有时需要直接控制分析过程,例如,通过直接命令在某个确切的时刻获取快照。 这可以通过向命令行分析器的 stdin 发送特殊消息来完成。

重要说明:

  • 发送到 stdin 的消息必须始终以新行开始并以回车符结束。

  • stdin 和 stdout 消息的格式均为 JSON 数组,例如, ##dotMemory["get-snapshot", {pid:1234}]

  • 您可以选择将消息写入文件,而不是发送到 stdin。 要指定文件位置,请使用 --service-input=path\to\file.svc 参数。 消息格式与 stdin 的格式相同。

启动 MyApp.exe 并通过 stdin 消息控制分析

  1. 无需额外的参数。 您可以像往常一样使用 attach 或任何 start 命令启动分析。 例如:

    dotMemory.exe start C:\MyApp\MyApp.exe

    dotMemory 能够通过发送特殊的服务消息到 stdout 来告知您分析过程的进展。 如果您通过某些外部脚本控制分析,这可能特别有用。 要启用对 stdout 消息的支持,请使用 --service-output 选项运行 dotMemory,例如:

    dotMemory.exe start --service-output C:\MyApp\MyApp.exe

    dotMemory 向 stdout 发送以下消息:

    • 分析会话开始

      ##dotMemory["connected", {pid: 1234}]
    • 正在保存快照

      ##dotMemory["workspace-saved", {path: "..."}]
  2. 通过向 stdin 发送以下命令获取快照:

    ##dotMemory["get-snapshot", {pid:1234}]

    如果指定了 pid ,dotMemory 将获取具有指定 PID 的进程的快照。 否则,dotMemory 将获取所有被分析进程的快照。

  3. 要停止分析并终止被分析的应用程序,请向 stdin 发送以下命令:

    ##dotMemory["disconnect"]

    适用于使用 attach 或任何 start 命令启动的所有分析会话。

启动 MyApp 并使用 stdin 消息控制分析

  1. 无需额外的参数。 您可以像往常一样使用 attach 或任何 start 命令启动分析。 例如:

    ./dotMemory.sh start ~/MyApp/MyApp

    dotMemory 能够通过发送特殊的服务消息到 stdout 来告知您分析过程的进展。 如果您通过某些外部脚本控制分析,这可能特别有用。 要启用对 stdout 消息的支持,请使用 --service-output 选项运行 dotMemory,例如:

    ./dotMemory.sh start --service-output ~/MyApp/MyApp

    dotMemory 向 stdout 发送以下消息:

    • 分析会话开始

      ##dotMemory["connected", {pid: 1234}]
    • 正在保存快照

      ##dotMemory["workspace-saved", {path: "..."}]
  2. 通过向 stdin 发送以下命令获取快照:

    ##dotMemory["get-snapshot", {pid:1234}]

    如果指定了 pid ,dotMemory 将获取具有指定 PID 的进程的快照。 否则,dotMemory 将获取所有被分析进程的快照。

  3. 要停止分析并终止被分析的应用程序,请向 stdin 发送以下命令:

    ##dotMemory["disconnect"]

    适用于使用 attach 或任何 start 命令启动的所有分析会话。

使用 API 启动应用程序并获取快照

您还可以选择使用 API控制分析(获取快照、从进程分离等)。

启动 MyApp.exe 并使用 API 控制分析

  • 运行命令:

    dotMemory.exe start --use-api C:\MyApp\MyApp.exe

启动 MyApp 并使用 API 控制分析

  • 运行命令:

    ./dotMemory.sh start --use-api ~/MyApp/MyApp

附加到正在运行的应用程序并进行分析

如果您想分析一个已在运行的应用程序并完全控制分析过程(与 get-snapshot场景不同),您应该使用 attach 命令。 它允许分析器附加到正在运行的进程(按 PID 或名称以及 get-snapshot )并通过触发器、stdin 命令或 API 获取快照。 例如,以下是分析正在运行的应用程序 MyApp 并使用触发器获取快照的示例。

附加到正在运行的应用程序并定期获取快照

  • 运行命令:

    dotMemory.exe attach MyApp.exe --trigger-timer=30s

附加到正在运行的应用程序并定期获取快照

  • 运行命令:

    ./dotMemory.sh attach MyApp --trigger-timer=30s

(仅限 Windows)运行并分析托管于 IIS 的 Web 应用程序

如果您想分析运行在 IIS 服务器上的 ASP.NET Web 应用程序,您应该使用 start-iis 命令。 运行命令后,IIS 将在分析模式下启动(有关如何分析托管于 IIS 的应用程序的更多信息,请参阅 在 IIS 服务器上分析 Web 应用程序)。 请注意, start-iis 支持与 start 命令相同的分析控制方式:使用触发器、stdin 命令和 API。 例如,以下是分析 Web 应用程序并使用触发器获取快照的示例。

在分析模式下运行 IIS 并定期获取快照

  • 运行命令:

    dotMemory.exe start-iis --trigger-timer=30s --open-url=localhost/myapp --use-browser=Chrome

这里:

  • --open-url=localhost/myapp - 被分析应用程序的 URL,运行分析后将打开。

  • --use-browser=Chrome - 用于打开 URL 的浏览器。 如果未提供,将使用默认系统浏览器。

最后修改日期: 2025年 9月 27日