关键词:开源|信息|什么秘密|工具|在过去|心仪3504|982020

应用微软公司的ProcDump调节Linux用这一微

  • 浏览: 23

应用微软公司的 ProcDump 调节 Linux

用这一微软公司的开源工具,获得过程信息。

微软公司愈来愈心仪 Linux 和开源,这并并不是什么秘密。在过去两年中,该企业平稳地提升了对开源的奉献,包含将其一部分手机软件和工具移殖到 Linux。2018 年末,微软公司公布将其 Sysinternals 的一部分工具以开源的方法移殖到 Linux,Linux 版的 ProcDump是在其中的第一个。

假如你一直在 Windows 上从业过调节或常见故障清除工作中,你很有可能听闻过 Sysinternals,它是一个“瑞士军刀”工具集,能够协助计算机管理员、开发者和 IT 安全性权威专家监管和清除 Windows 自然环境的常见故障。

Sysinternals 最火爆的工具之一是 ProcDump。说白了,它用以将已经运作的过程的运行内存转储到硬盘上的一个关键文档中。随后可以用程序调试对这一关键文档开展剖析,掌握转储时过程的情况。由于以前使用过 Sysinternals,所以我特想试一下 ProcDump 的 Linux 移植版。

刚开始应用 Linux 上的 ProcDump

要使用 Linux 上的 ProcDump,你需要免费下载该工具并编译程序它。:

$ 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$

编译程序全过程中会建立2个新的文件目录。第一个是 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$

运作 ProcDump

要转储一个过程的运行内存,你需要向 ProcDump 出示它的过程 ID。你能应用设备上一切已经运作的程序流程或守护进程。在这个事例中,我将应用一个始终循环系统的小 C 程序流程。编译程序并运作它:

$ cat progxyz.c#include 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'$

用 GNU 新项目程序调试剖析关键文档。

要查询是不是能够载入该转储文档,启用 GNU 新项目程序调试。还记得出示检测二进制文件的途径,那样你也就能够见到堆栈上全部的涵数名。在这儿,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.5Missing 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)

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.5Missing 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$

你应该应用 ProcDump 還是 gcore?

有几种状况下,你很有可能更喜欢应用 ProcDump 而不是 gcore,ProcDump 有一些内嵌的作用,在一些状况下很有可能很有效。

等候检测二进制文件的实行

不论是应用 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'$

好几个关键转储

另一个关键的 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$

根据 CPU 和运行内存应用状况的关键转储

ProcDump 还能够使你在检测二进制或过程做到一定的 CPU 或运行内存阀值时开启关键转储。ProcDump 的指南页显示信息了启用 ProcDump 时应用的命令行参数:

-C:当 CPU 超出或相当于特定值时,开启关键转储转化成。-c:当 CPU 低于特定值时,开启关键转储转化成。-M:当运行内存递交超出或相当于特定值时,开启关键转储转化成。-m:当运行内存递交低于特定值时,开启关键转储转化成。-T:当线程数超出或相当于特定值时开启。-F:当文件描述符总数超出或相当于特定值时开启。-I:轮询頻率,企业为ms。

比如,当给出 PID 的 CPU 利用率超出 70% 时,能够规定 ProcDump 转储关键:

procdump -C 70 -n 3 -p 351014

结果

ProcDump 是一长串被移殖到 Linux 的 Windows 程序流程中的一个趣味的填补。它不但为 Linux 客户出示了附加的专用工具挑选,并且能够让 Windows 客户在 Linux 上工作中时更有了解的觉得。

猜你喜欢