$ 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(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'$
用 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)
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$
推荐阅读
- 认知图谱——人工智能的下一个瑰宝
- 想学习人工智能,这个的数据集必须掌握,MNIST入门与实战
- ROS 的常用命令行工具
- 基于WPF的串口调试工具
- 好茶的存仓条件,普洱茶的储存条件
- 那些前端开发需要掌握的:Vuex基础使用方法
- 喝大麦茶的好处,喝大麦茶坏处
- 菊花茶清新淡雅,薄荷塘古树茶的特点
- 荷叶泡茶的作用有哪些,荷叶泡茶的功效与作用有哪些
- 壶承是做什么用的,茶仓是做什么用的