使用 dotMemory 命令行分析器
您可以使用 dotMemory 命令行分析器分析任何 .NET 或 .NET Core 应用程序(包括已在运行的应用程序)并获取内存快照。
该工具在多种场景下非常有用:
在远程服务器上分析应用程序
例如,当无法在服务器上安装独立的 dotMemory 时。
自动化内存快照收集过程
例如,如果您希望将分析作为持续集成构建的一部分:这可以是执行集成测试分析的构建步骤。
加速分析流程
例如,当您定期分析相同的应用程序且不希望每次都启动 dotMemory 用户界面时。
分发
该工具免费分发为 .zip 压缩包或 NuGet 包(Windows、 Linux、 macOS ),无需安装 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 消息控制分析
无需额外的参数。 您可以像往常一样使用
attach或任何start命令启动分析。 例如:dotMemory.exe start C:\MyApp\MyApp.exedotMemory 能够通过发送特殊的服务消息到 stdout 来告知您分析过程的进展。 如果您通过某些外部脚本控制分析,这可能特别有用。 要启用对 stdout 消息的支持,请使用
--service-output选项运行 dotMemory,例如:dotMemory.exe start --service-output C:\MyApp\MyApp.exedotMemory 向 stdout 发送以下消息:
分析会话开始
##dotMemory["connected", {pid: 1234}]正在保存快照
##dotMemory["workspace-saved", {path: "..."}]
通过向 stdin 发送以下命令获取快照:
##dotMemory["get-snapshot", {pid:1234}]如果指定了
pid,dotMemory 将获取具有指定 PID 的进程的快照。 否则,dotMemory 将获取所有被分析进程的快照。要停止分析并终止被分析的应用程序,请向 stdin 发送以下命令:
##dotMemory["disconnect"]适用于使用
attach或任何start命令启动的所有分析会话。
启动 MyApp 并使用 stdin 消息控制分析
无需额外的参数。 您可以像往常一样使用
attach或任何start命令启动分析。 例如:./dotMemory.sh start ~/MyApp/MyAppdotMemory 能够通过发送特殊的服务消息到 stdout 来告知您分析过程的进展。 如果您通过某些外部脚本控制分析,这可能特别有用。 要启用对 stdout 消息的支持,请使用
--service-output选项运行 dotMemory,例如:./dotMemory.sh start --service-output ~/MyApp/MyAppdotMemory 向 stdout 发送以下消息:
分析会话开始
##dotMemory["connected", {pid: 1234}]正在保存快照
##dotMemory["workspace-saved", {path: "..."}]
通过向 stdin 发送以下命令获取快照:
##dotMemory["get-snapshot", {pid:1234}]如果指定了
pid,dotMemory 将获取具有指定 PID 的进程的快照。 否则,dotMemory 将获取所有被分析进程的快照。要停止分析并终止被分析的应用程序,请向 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 的浏览器。 如果未提供,将使用默认系统浏览器。