windows守护进程工具_使用微软的 ProcDump 调试 Linux 进程 | Linux 中国

  992b489150c777e7bf5c0e4e487c81e8.png 导读:用这个微软的开源工具,获取进程信息。                                           本文字数:12941,阅读时长大约: 14分钟https://linux.cn/article-12533-1.html 作者:Gaurav Kamathe 译者:Xingyu.Wang

微软越来越心仪 Linux 和开源,这并不是什么秘密。在过去几年中,该公司稳步地增加了对开源的贡献,包括将其部分软件和工具移植到 Linux。2018 年底,微软宣布将其 Sysinternals 的部分工具以开源的方式移植到 Linux,Linux 版的 ProcDump是其中的第一个。

如果你在 Windows 上从事过调试或故障排除工作,你可能听说过 Sysinternals,它是一个“瑞士军刀”工具集,可以帮助系统管理员、开发人员和 IT 安全专家监控和排除 Windows 环境的故障。

Sysinternals 最受欢迎的工具之一是 ProcDump。顾名思义,它用于将正在运行的进程的内存转储到磁盘上的一个核心文件中。然后可以用调试器对这个核心文件进行分析,了解转储时进程的状态。因为之前用过 Sysinternals,所以我很想试试 ProcDump 的 Linux 移植版。

c9766951-5735-eb11-8da9-e4434bdf6706.svg

开始使用 Linux 上的 ProcDump

要试用 Linux 上的 ProcDump,你需要下载该工具并编译它。(我使用的是 Red Hat Enterprise Linux,尽管这些步骤在其他 Linux 发行版上应该是一样的):

$ cat /etc/redhat-releaseRed Hat Enterprise Linux release 8.2 (Ootpa)$$ uname -r4.18.0-193.el8.x86_64$

首先,克隆 Linux 版 ProcDump 的版本库。

$ git clone https://github.com/microsoft/ProcDump-for-Linux.gitCloning into 'ProcDump-for-Linux'...remote: Enumerating objects: 40, done.remote: Counting objects: 100% (40/40), done.remote: Compressing objects: 100% (33/33), done.remote: Total 414 (delta 14), reused 14 (delta 6), pack-reused 374Receiving objects: 100% (414/414), 335.28 KiB | 265.00 KiB/s, done.Resolving deltas: 100% (232/232), done.$$ cd ProcDump-for-Linux/$$ lsazure-pipelines.yml  CONTRIBUTING.md  docs     INSTALL.md  Makefile    procdump.gif  srcCODE_OF_CONDUCT.md   dist             include  LICENSE     procdump.1  README.md     tests$

接下来,使用 make 构建程序。它能准确地输出编译源文件所需的 GCC 命令行参数。

$ makerm -rf objrm -rf binrm -rf /root/ProcDump-for-Linux/pkgbuildgcc -c -g -o obj/Logging.o src/Logging.c -Wall -I ./include -pthread -std=gnu99gcc -c -g -o obj/Events.o src/Events.c -Wall -I ./include -pthread -std=gnu99gcc -c -g -o obj/ProcDumpConfiguration.o src/ProcDumpConfiguration.c -Wall -I ./include -pthread -std=gnu99gcc -c -g -o obj/Handle.o src/Handle.c -Wall -I ./include -pthread -std=gnu99gcc -c -g -o obj/Process.o src/Process.c -Wall -I ./include -pthread -std=gnu99gcc -c -g -o obj/Procdump.o src/Procdump.c -Wall -I ./include -pthread -std=gnu99gcc -c -g -o obj/TriggerThreadProcs.o src/TriggerThreadProcs.c -Wall -I ./include -pthread -std=gnu99gcc -c -g -o obj/CoreDumpWriter.o src/CoreDumpWriter.c -Wall -I ./include -pthread -std=gnu99gcc -o bin/procdump obj/Logging.o obj/Events.o obj/ProcDumpConfiguration.o obj/Handle.o obj/Process.o obj/Procdump.o obj/TriggerThreadProcs.o obj/CoreDumpWriter.o -Wall -I ./include -pthread -std=gnu99gcc -c -g -o obj/ProcDumpTestApplication.o tests/integration/ProcDumpTestApplication.c -Wall -I ./include -pthread -std=gnu99gcc -o bin/ProcDumpTestApplication obj/ProcDumpTestApplication.o -Wall -I ./include -pthread -std=gnu99$

编译过程中会创建两个新的目录。第一个是 obj/ 目录,存放编译期间创建的对象文件。第二个(也是更重要的)目录是 bin/,它是存储编译出的 procdump 程序的地方。它还会编译另一个名为 ProcDumpTestApplication 的测试二进制文件:

$ ls obj/CoreDumpWriter.o  Handle.o   ProcDumpConfiguration.o  ProcDumpTestApplication.o  TriggerThreadProcs.oEvents.o          Logging.o  Procdump.o               Process.o$$$ ls bin/procdump  ProcDumpTestApplication$$ file bin/procdumpbin/procdump: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=6e8827db64835ea0d1f0941ac3ecff9ee8c06e6b, with debug_info, not stripped$$ file bin/ProcDumpTestApplicationbin/ProcDumpTestApplication: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=c8fd86f53c07df142e52518815b2573d1c690e4e, with debug_info, not stripped$

在此情况下,每次运行 procdump 实用程序时,你都必须移动到 bin/ 文件夹中。要使它在系统中的任何地方都可以使用,运行 make install。这将这个二进制文件复制到通常的 bin/ 目录中,它是你的 shell $PATH 的一部分:

$ which procdump/usr/bin/which: no procdump in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)$$ make installmkdir -p //usr/bincp bin/procdump //usr/binmkdir -p //usr/share/man/man1cp procdump.1 //usr/share/man/man1$$ which procdump/usr/bin/procdump$

安装时,ProcDump 提供了一个手册页,你可以用 man procdump 访问:

$ man procdump$ c9766951-5735-eb11-8da9-e4434bdf6706.svg

运行 ProcDump

要转储一个进程的内存,你需要向 ProcDump 提供它的进程 ID(PID)。你可以使用机器上任何正在运行的程序或守护进程。在这个例子中,我将使用一个永远循环的小 C 程序。编译程序并运行它(要退出程序,按 Ctrl+C,如果程序在后台运行,则使用 kill 命令并输入 PID):

$ cat progxyz.c#include <stdio.h>int main() {        for (;;)        {                printf(".");                sleep(1);        }        return 0;}$$ gcc progxyz.c -o progxyz$$ ./progxyz &[1] 350498$

运行该程序,你可以使用 pgrep 或 ps 找到它的 PID。记下 PID:

$ pgrep progxyz350498$$ ps -ef | grep progxyzroot      350498  345445  0 03:29 pts/1    00:00:00 ./progxyzroot      350508  347350  0 03:29 pts/0    00:00:00 grep --color=auto progxyz$

当测试进程正在运行时,调用 procdump 并提供 PID。下面的输出表明了该进程的名称和 PID,并报告它生成了一个核心转储文件,并显示其文件名:

$ procdump -p 350498ProcDump v1.1.1 - Sysinternals process dump utilityCopyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.Mark Russinovich, Mario Hewardt, John Salem, Javid HabibiMonitors a process and writes a dump file when the process exceeds thespecified criteria.Process:                progxyz (350498)CPU Threshold:          n/aCommit Threshold:       n/aPolling interval (ms):  1000Threshold (s):  10Number of Dumps:        1Press Ctrl-C to end monitoring without terminating the process.[03:30:00 - INFO]: Timed:[03:30:01 - INFO]: Core dump 0 generated: progxyz_time_2020-06-24_03:30:00.350498$

列出当前目录的内容,你应该可以看到新的核心文件。文件名与 procdump 命令显示的文件名一致,日期、时间、PID 都会附加在文件名上:

$ ls -l progxyz_time_2020-06-24_03\:30\:00.350498-rw-r--r--. 1 root root 356848 Jun 24 03:30 progxyz_time_2020-06-24_03:30:00.350498$$ file progxyz_time_2020-06-24_03\:30\:00.350498progxyz_time_2020-06-24_03:30:00.350498: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from './progxyz', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './progxyz', platform: 'x86_64'$ c9766951-5735-eb11-8da9-e4434bdf6706.svg

用 GNU 项目调试器分析核心文件。

要查看是否可以读取该转储文件,调用 GNU 项目调试器(gdb)。记得提供测试二进制文件的路径,这样你就可以看到堆栈上所有的函数名。在这里,bt(回溯)表明,当转储被采集时,sleep() 函数正在执行:

$ gdb -q ./progxyz ./progxyz_time_2020-06-24_03\:30\:00.350498Reading symbols from ./progxyz...(no debugging symbols found)...done.[New LWP 350498]Core was generated by `./progxyz'.#0  0x00007fb6947e9208 in nanosleep () from /lib64/libc.so.6Missing separate debuginfos, use: yum debuginfo-install glibc-2.28-101.el8.x86_64(gdb) bt#0  0x00007fb6947e9208 in nanosleep () from /lib64/libc.so.6#1  0x00007fb6947e913e in sleep () from /lib64/libc.so.6#2  0x00000000004005f3 in main ()(gdb) c9766951-5735-eb11-8da9-e4434bdf6706.svg

gcore 怎么样?

Linux 用户会很快指出,Linux 已经有一个叫 gcore 的命令,大多数 Linux 发行版都有这个命令,它的作用和 ProcDump 完全一样。你说的对。如果你从来没有使用过它,可以尝试用 gcore 来转储一个进程的核心。再次运行测试程序,然后运行 gcore,并提供 PID 作为参数:

$ ./progxyz &[1] 350664$$$ pgrep progxyz350664$$$ gcore 3506640x00007fefd3be2208 in nanosleep () from /lib64/libc.so.6Saved corefile core.350664[Inferior 1 (process 350664) detached]$

gcore 打印一条消息,说它已将核心文件保存到一个特定的文件中。检查当前目录,找到这个核心文件,然后再次使用 gdb 加载它:

$$ ls -l  core.350664-rw-r--r--. 1 root root 356848 Jun 24 03:34 core.350664$$$ file core.350664core.350664: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from './progxyz', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './progxyz', platform: 'x86_64'$$ gdb -q ./progxyz ./core.350664Reading symbols from ./progxyz...(no debugging symbols found)...done.[New LWP 350664]Core was generated by `./progxyz'.#0  0x00007fefd3be2208 in nanosleep () from /lib64/libc.so.6Missing separate debuginfos, use: yum debuginfo-install glibc-2.28-101.el8.x86_64(gdb) bt#0  0x00007fefd3be2208 in nanosleep () from /lib64/libc.so.6#1  0x00007fefd3be213e in sleep () from /lib64/libc.so.6#2  0x00000000004005f3 in main ()(gdb) q$

为了使 gcore 可以工作,你需要确保以下设置到位。首先,确保为核心文件设置了 ulimit,如果设置为 0,核心文件将不会被生成。第二,确保 /proc/sys/kernel/core_pattern 有正确的设置来指定核心模式:

$ ulimit -cunlimited$ c9766951-5735-eb11-8da9-e4434bdf6706.svg

你应该使用 ProcDump 还是 gcore?

有几种情况下,你可能更喜欢使用 ProcDump 而不是 gcore,ProcDump 有一些内置的功能,在一些情况下可能很有用。

c9766951-5735-eb11-8da9-e4434bdf6706.svg

等待测试二进制文件的执行

无论是使用 ProcDump 还是 gcore,测试进程必须被执行并处于运行状态,这样才能提供一个 PID 来生成核心文件。但 ProcDump 有一个功能,就是等待特定的二进制文件运行,一旦发现运行的测试二进制文件与给定的名称相匹配,它就会为该测试二进制文件生成一个核心文件。它可以使用 -w 参数和程序名称而不是 PID 来启用。这个功能在测试程序快速退出的情况下很有用。

下面是它的工作原理。在这个例子中,没有名为 progxyz 的进程在运行:

$ pgrep progxyz$

用 -w 参数调用 procdump,让它保持等待。在另一个终端,调用测试二进制 progxyz

$ procdump -w progxyzProcDump v1.1.1 - Sysinternals process dump utilityCopyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.Mark Russinovich, Mario Hewardt, John Salem, Javid HabibiMonitors a process and writes a dump file when the process exceeds thespecified criteria.Process:                progxyz (pending)CPU Threshold:          n/aCommit Threshold:       n/aPolling interval (ms):  1000Threshold (s):  10Number of Dumps:        1Press Ctrl-C to end monitoring without terminating the process.[03:39:23 - INFO]: Waiting for process 'progxyz' to launch...

然后,从另一个终端调用测试二进制 progxyz

$ ./progxyz &[1] 350951$

ProcDump 立即检测到该二进制正在运行,并转储这个二进制的核心文件:

[03:39:23 - INFO]: Waiting for process 'progxyz' to launch...[03:43:22 - INFO]: Found process with PID 350951[03:43:22 - INFO]: Timed:[03:43:23 - INFO]: Core dump 0 generated: progxyz_time_2020-06-24_03:43:22.350951$$ ls -l progxyz_time_2020-06-24_03\:43\:22.350951-rw-r--r--. 1 root root 356848 Jun 24 03:43 progxyz_time_2020-06-24_03:43:22.350951$$ file progxyz_time_2020-06-24_03\:43\:22.350951progxyz_time_2020-06-24_03:43:22.350951: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from './progxyz', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './progxyz', platform: 'x86_64'$ c9766951-5735-eb11-8da9-e4434bdf6706.svg

多个核心转储

另一个重要的 ProcDump 功能是,你可以通过使用命令行参数 -n  指定要生成多少个核心文件。核心转储之间的默认时间间隔是 10 秒,但你可以使用 -s  参数修改。这个例子使用 ProcDump 对测试二进制文件进行了三次核心转储:

$ ./progxyz &[1] 351014$$ procdump -n 3 -p 351014ProcDump v1.1.1 - Sysinternals process dump utilityCopyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.Mark Russinovich, Mario Hewardt, John Salem, Javid HabibiMonitors a process and writes a dump file when the process exceeds thespecified criteria.Process:                progxyz (351014)CPU Threshold:          n/aCommit Threshold:       n/aPolling interval (ms):  1000Threshold (s):  10Number of Dumps:        3Press Ctrl-C to end monitoring without terminating the process.[03:45:20 - INFO]: Timed:[03:45:21 - INFO]: Core dump 0 generated: progxyz_time_2020-06-24_03:45:20.351014[03:45:31 - INFO]: Timed:[03:45:32 - INFO]: Core dump 1 generated: progxyz_time_2020-06-24_03:45:31.351014[03:45:42 - INFO]: Timed:[03:45:44 - INFO]: Core dump 2 generated: progxyz_time_2020-06-24_03:45:42.351014$$ ls -l progxyz_time_2020-06-24_03\:45\:*-rw-r--r--. 1 root root 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:20.351014-rw-r--r--. 1 root root 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:31.351014-rw-r--r--. 1 root root 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:42.351014$ c9766951-5735-eb11-8da9-e4434bdf6706.svg

基于 CPU 和内存使用情况的核心转储

ProcDump 还可以让你在测试二进制或进程达到一定的 CPU 或内存阈值时触发核心转储。ProcDump 的手册页显示了调用 ProcDump 时使用的命令行参数:

◈  -C:当 CPU 超过或等于指定值时,触发核心转储生成(0 到 100 * nCPU)。◈  -c:当 CPU 小于指定值时,触发核心转储生成(0 到 100 * nCPU)。◈  -M:当内存提交超过或等于指定值(MB)时,触发核心转储生成。◈  -m:当内存提交小于指定值(MB)时,触发核心转储生成。◈  -T:当线程数超过或等于指定值时触发。◈  -F:当文件描述符数量超过或等于指定值时触发。◈  -I:轮询频率,单位为毫秒(默认为 1000)。

例如,当给定 PID 的 CPU 使用率超过 70% 时,可以要求 ProcDump 转储核心:

procdump -C 70 -n 3 -p 351014 c9766951-5735-eb11-8da9-e4434bdf6706.svg

结论

ProcDump 是一长串被移植到 Linux 的 Windows 程序中的一个有趣的补充。它不仅为 Linux 用户提供了额外的工具选择,而且可以让 Windows 用户在 Linux 上工作时更有熟悉的感觉。


via: https://opensource.com/article/20/7/procdump-linux

作者:Gaurav Kamathe 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

12776951-5735-eb11-8da9-e4434bdf6706.svg

82993394f4d217253bb8374dc8ac0a1c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微软procdump32是一款用于生成进程转储文件的实用工具。通过使用procdump32,用户可以捕获正常运行或崩溃的进程的内存快照,以便进一步调试和分析。以下是procdump32的一些重要特点: 1. 进程转储:procdump32可以将进程的完整内存转储保存到一个文件中。这个文件包含了进程的当前内存状态,包括堆栈、寄存器以及其他关键信息。这个文件可以在之后由开发人员用于分析和调试。 2. 异常转储:如果一个进程发生异常或崩溃,procdump32可以自动捕获崩溃信息并生成转储文件。这个转储文件可以被用于分析程序为什么崩溃的原因,并帮助开发人员修复错误。 3. 高度可配置:procdump32提供了丰富的配置选项,例如指定进程异常时自动触发转储的阈值、转储文件的位置和格式等。这使得开发人员可以根据特定的需要调整工具的行为。 4. 命令行界面:procdump32支持命令行使用,可以通过命令行参数指定要转储的进程PID或名称。这使得工具可以很容易地集成到自动化脚本或其他调试工具中。 总的来说,微软procdump32是一个功能强大的进程转储工具。它可以帮助开发人员捕获进程的内存状态,使得调试和分析变得更加方便有效,从而提高开发效率和软件质量。 ### 回答2: Procdump32是微软开发的一款用于抓取进程的崩溃转储信息的实用工具。该工具可以在Windows操作系统上运行,并且提供了命令行界面,易于使用Procdump32的主要作用是在指定的进程崩溃时生成转储文件,用于分析程序崩溃的原因。它可以捕获进程的崩溃堆栈、寄存器以及其他相关信息,并将其保存在转储文件中。这些转储文件可以被开发人员或调试人员用于故障排除和问题分析。 除了捕获进程崩溃时的转储信息外,Procdump32还支持针对特定的性能指标、异常条件或CPU利用率等情况生成转储文件。用户可以根据需要配置这些转储规则,并在指定的条件满足时生成转储文件,以便进一步分析和调试问题。 Procdump32可以用于分析各种类型的进程崩溃,包括应用程序、驱动程序等。它是一个非常强大和实用的工具,特别适用于开发人员和系统管理员在诊断和解决应用程序崩溃问题时使用。 总之,微软的Procdump32是一款功能强大的工具,可以帮助用户捕获和分析进程崩溃的转储信息。它是一个重要的故障排除工具,可以提高应用程序的稳定性和可靠性。 ### 回答3: 微软procdump32是一款用于Windows操作系统的实用工具,它主要用于生成进程转储文件(Dump File)。进程转储文件是指在程序崩溃或出现异常时,记录下进程的内存状态、栈信息及其他相关的调试信息,以便后续进行分析和调试使用procdump32可以方便地监视和生成指定进程的转储文件。它提供了多种配置选项,通过命令行参数可以定义转储文件生成的条件和规则。例如,可以设置转储文件生成的触发条件,如进程崩溃、CPU占用、内存占用等;还可以设置生成转储文件的路径、文件名及格式;另外,它还支持生成多个目标进程的转储文件。 生成的转储文件可以在后续调试过程中使用。也可以使用procdump32配合其他调试工具,如WinDbg进行分析和诊断。这样可以在程序出现问题时,更方便地进行故障排查和问题定位。 微软procdump32工具使用非常灵活且功能丰富,是许多开发人员和系统管理员进行故障排查的重要辅助工具。无论是定位内存泄漏、处理崩溃问题还是进行性能优化,都可以借助procdump32生成的转储文件来帮助快速定位问题根源和进行深入分析。 总而言之,微软procdump32是一款强大的进程转储文件生成工具,它在故障排查和开发调试中具有重要作用,可以帮助开发人员更快速地定位和解决各种问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值