C++(Qt)软件调试---学会使用ProcDump(5)

C++(Qt)软件调试—学会使用ProcDump(5)

文章目录

  • C++(Qt)软件调试---学会使用ProcDump(5)
    • 1、前言
      • 1.1 ProcDump是什么
      • 1.2 为什么要用ProcDump
    • 2、下载安装ProcDump
      • 1.1 Windows
      • 1.2 Ubuntu
    • 3、Windows下使用ProcDump
      • 1.1 使用方法分类
      • 1.2 使用语法
      • 1.3 Dump类型参数
      • 1.4 条件参数
      • 1.5 许可协议
      • 1.6 自动终止
      • 1.7 dump文件名格式
      • 1.8 使用示例
      • 1.9 安装使用方式语法使用示例
      • 1.10 显示示例命令行列表
    • 4、Ubuntu下使用ProcDump
      • 1.1 使用语法
      • 1.2 参数
      • 1.3 使用示例
    • 5、总结

更多精彩内容
个人内容分类汇总
C++软件调试、异常定位
  • 离线版下载

    • PDF版本,不支持GIF
    • HTML版本,支持GIF
    • C++调试工具下载地址:链接:https://pan.baidu.com/s/1K38BV6PtcyzZmNj6FEfY_A 提取码:e306

1、前言

1.1 ProcDump是什么

ProcDump是一个由Microsoft Sysinternals开发的命令行小工具,用于在Windows系统上监视和生成进程转储文件。

它可以监视进程在CPU使用率、内存占用、I/O操作等方面的性能,并在进程崩溃时自动生成转储文件,以便进行后续调试和分析。

ProcDump的主要功能包括:

  • 支持监视进程的CPU使用率、内存占用、I/O操作等性能指标;
  • 支持生成进程转储文件以进行后续调试和分析;
  • 支持设置条件触发进程转储,如CPU使用率超过某个阈值;
  • 支持生成完整的进程转储文件或者只生成异常堆栈信息;
  • 支持远程监视和生成进程转储文件。(windows服务器)

ProcDump是一款功能强大的小工具,对于Windows系统下的进程监视和调试非常有帮助。

在Github上也有一个ProcDump工具,可用于Linux系统(linux上功能没有Windows的强)。。

1.2 为什么要用ProcDump

  1. 之前用过的方法DbgHelp、qBreakpad生成Dump、Linux下配置ulimit -c unlimited生成core的方式功能都比较单一,并且需要配置环境,在程序中调用库,使用较为复杂。
  2. 而ProcDump 使用非常简单,不需要配置环境,不需要修改代码,将程序下载到本地后,通过命令行设置监听条件、需要监听的程序,然后就可以在条件满足或者目标程序崩溃时快速生成进程转储文件。
  3. 在Windows中还可以为MinGW编译的程序生成dump文件,这是之前的几种方法不支持的。
  4. 并且procdump和之前的几种捕获dump/core的方式并不冲突,可以一起使用。

2、下载安装ProcDump

1.1 Windows

  1. 下载地址及官方资料

  2. 测试环境:

    • 系统:Windows10
    • Qt版本:Qt5.12.5
    • 编译器:MinGW64、MSVC2017-64
  3. 如图所示,点击直接下载,非常小的工具,还不到1M;

    C++(Qt)软件调试---学会使用ProcDump(5)_第1张图片

  4. 解压后如下图所示;

    C++(Qt)软件调试---学会使用ProcDump(5)_第2张图片

  5. 因为会经常用到,所以最好把Procdump文件夹添加进环境变量中;

  6. 搜索环境变量,打开【编辑系统编辑变量】程序;

    C++(Qt)软件调试---学会使用ProcDump(5)_第3张图片

  7. 点击【环境变量】按键;

    C++(Qt)软件调试---学会使用ProcDump(5)_第4张图片

  8. 双击【Path】->【新建】->加入Procdump所在路径,然后全部点确定;

    C++(Qt)软件调试---学会使用ProcDump(5)_第5张图片

  9. 打开一个cmd窗口,输入procdump,如果打印出help信息则安装成功;

    C++(Qt)软件调试---学会使用ProcDump(5)_第6张图片

  10. 注意:这里有一个有意思的现象,解压文件夹下原来有3个文件,但是当运行procdump后就会发现procdump64不见了

    • 但是当我们再运行procdump 捕获64位程序时就会发现,运行期间procdump64会突然出现,运行结束后就又消失了;
    • 而运行procdump捕获32位程序时procdump64不会出现;
    • 所以不用担心,这只是procdump处理32/64位程序的策略。

1.2 Ubuntu

  1. 下载地址及官方资料

  2. 这里的安装方法适用于Ubuntu,其它Linux系统可以看Github上的安装教程;

  3. 适用于Ubuntu 16.04, 18.04, 20.04 & 22.04 & 22.10

  4. 测试环境:

    • 系统:ubuntu22.04
    • Qt版本:Qt5.15.5
    • 编译器:GCC/G++
  5. 安装方式1:

    1. 注册微软密钥和源:

      wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
      sudo dpkg -i packages-microsoft-prod.deb
      
    2. 安装程序转储

      sudo apt-get update
      sudo apt-get install procdump
      
  6. 安装方式2:

    1. 进入这里下载安装包;

      C++(Qt)软件调试---学会使用ProcDump(5)_第7张图片

    2. 使用下列命令安装:

      sudo dpkg -i procdump_1.4.1-14851_amd64.deb 
      
  7. 安装方式3:

    1. 使用下列命令下载源码;

      git clone https://github.com/Sysinternals/ProcDump-for-Linux.git
      
    2. 然后按照源码中README.md文件中的方法编译源码。

  8. 在终端窗口中输入procdump,回车后如果显示帮助信息则按照成功;

    C++(Qt)软件调试---学会使用ProcDump(5)_第8张图片

3、Windows下使用ProcDump

1.1 使用方法分类

ProcDump从使用方式上可以分为两种:

  1. 第一种是每次使用命令行指定要监控、捕获的目标程序,只对这一个程序生效;
  2. 第二种是将ProcDump安装到AeDebug中,只需要执行一次安装命令,后续不用重复设置,可对所有程序生效,只要有程序异常退出就可以在指定目录下生成Dump文件。

1.2 使用语法

  1. 捕获目标程序语法:

    procdump.exe [-mm] [-ma] [-mt] [-mp] [-mc <Mask>] [-md <Callback_DLL>] [-mk]
                [-n <Count>]
                [-s <Seconds>]
                [-c|-cl <CPU_Usage> [-u]]
                [-m|-ml <Commit_Usage>]
                [-p|-pl <Counter> <Threshold>]
                [-h]
                [-e [1] [-g] [-b] [-ld] [-ud] [-ct] [-et]]
                [-l]
                [-t]
                [-f  <Include_Filter>, ...]
                [-fx <Exclude_Filter>, ...]
                [-dc <Comment>]
                [-o]
                [-r [1..5] [-a]]
                [-at <Timeout>]
                [-wer]
                [-64]
                {
                    {{[-w] <Process_Name> | <Service_Name> | <PID>} [<Dump_File> | <Dump_Folder>]}
                |
                    {-x <Dump_Folder> <Image_File> [Argument, ...]}
                }
    
  2. 安装使用方式语法:

    procdump.exe -i [Dump_Folder]
                [-mm] [-ma] [-mt] [-mp] [-mc <Mask>] [-md <Callback_DLL>] [-mk]
                [-r]
                [-at <Timeout>]
                [-k]
                [-wer]
    
  3. 卸载语法:

    procdump.exe -u
    

1.3 Dump类型参数

  • Procdump 工具提供了多种不同的 dump types(转储类型)选项,用于控制生成的进程转储文件的内容和大小。
  • 生成的dump越大,保存的信息越详细,但生成速度就越慢。
  • 需要根据不同的调试和分析需求选择合适的 dump types,以便生成最有用的进程转储文件。
  • 在实际使用中,可以根据进程的大小、稳定性和性能要求等因素来选择不同的 dump types,以达到最佳的调试和分析效果。
Dump类型 说明
-mm 写入“Mini”转储文件。 (默认值)
- 包括直接或间接引用的内存 (堆栈及其) 引用的内容。
- 包括 (进程、线程、模块、句柄、地址空间等) 的所有元数据。
- 由于 MiniDump 文件比较小,因此生成速度比较快,但是不够详细,
可能无法满足高级调试和分析需求。
-ma 写入“Full”转储文件。
- 包括所有内存 (映像、映射和专用) 。
- 包括 (进程、线程、模块、句柄、地址空间等) 的所有元数据。
- 是一种最详细的转储类型,包含了进程的所有信息,包括代码、数据、堆、栈等等。
FullDump 文件非常大,生成速度比较慢,但是可以提供最全面的信息,
适合用于高级调试和分析。
-mt 写入“Triage”转储文件。
- 包括直接引用的内存 (堆栈) 。
- 包括有限的元数据 (进程、线程、模块和句柄) 。
- 尝试删除敏感信息,但不能保证。
- 是一种特殊的转储类型,用于生成进程的三态(triage)转储文件。
三态转储文件包含了进程的核心信息和一些关键的线程和内存信息,
可以用于快速分析进程崩溃和异常问题。由于三态转储文件比 MiniDump 文件稍大,
因此生成速度比 MiniDump 慢,但是比 FullDump 快,适合用于快速诊断问题。
-mp 写入“MiniPlus”转储文件。
- 包括所有专用内存和所有读/写映像或映射内存。
- 包括 (进程、线程、模块、句柄、地址空间等) 的所有元数据。
- 为了最小化大小,将排除超过 512MB 的最大专用内存区域。
内存区域定义为相同大小的内存分配的总和。
转储与完整转储一样详细,但大小为 10%-75%。
- 注意:由于调试限制,CLR 进程将转储为 Full (-ma) 。
- 是一种介于 MiniDump 和 FullDump 之间的转储类型,包含 MiniDump 中的基本信息
以及更多的线程和内存信息。MiniPlusDump 文件比 MiniDump 文件稍大,
但是生成速度比 FullDump 快,适合一些中等大小的进程。
-mc 写入“Custom”转储文件。
- 包括由指定的 MINIDUMP_TYPE 掩码 (十六进制) 定义的内存和元数据。
-md 写入“Callback”转储文件。
- 包括由指定DLL的名为MiniDumpCallbackRoutine的MiniDumpWriteDump
回调例程定义的内存。
- 包括 (进程、线程、模块、句柄、地址空间等) 的所有元数据。
-mk 此外,还要编写“Kernel”转储文件。
- 包括进程中线程的内核堆栈。
- 当使用克隆(-r)时,操作系统不支持内核转储(-mk)。
- 当使用多个转储大小时,每个转储大小都会有一个内核转储。

1.4 条件参数

  • 条件参数有什么用

procdump 的 Conditions 参数可以用来设置进程崩溃时触发 Dump 文件生成的条件。

通过设置 Conditions 参数,我们可以根据进程的状态、性能指标等信息来触发 Dump 文件的生成,进而更好地定位程序崩溃的原因。

Conditions 参数可以设置的条件包括:

  • CPU 占用率:当进程的 CPU 占用率超过指定的阈值时,生成 Dump 文件。
  • 内存占用率:当进程的内存占用率超过指定的阈值时,生成 Dump 文件。
  • I/O 操作:当进程的 I/O 操作数超过指定的阈值时,生成 Dump 文件。
  • 异常:当进程发生指定类型的异常时,生成 Dump 文件。

通过设置 Conditions 参数,我们可以针对具体的场景精确触发 Dump 文件的生成,从而更好地定位程序崩溃的原因。

例如,当进程的 CPU 占用率突然飙升时,可以使用 Conditions 参数来自动触发 Dump 文件的生成,以便分析占用 CPU 的代码片段。

条件 说明
-a 避免中断。 需要 -r。 如果触发器会导致目标由于超出并发转储限制而长时间挂起,则将跳过该触发器。
-at 避免在超时时中断。在N秒时取消触发器的收集。
-b 将调试断点视为异常(否则忽略它们)。
-c CPU阈值,超过该阈值可创建进程的转储。
-cl CPU阈值,低于该阈值可创建进程的转储。
-dc 将指定的字符串添加到生成的转储注释中。
-e 当进程遇到未处理的异常时,写入一个转储文件。
如果要在发生第一次机会异常时创建转储文件,请添加 1
添加 -ld 以在加载 DLL(模块)时创建转储文件(过滤器适用)。
添加 -ud 以在卸载 DLL(模块)时创建转储文件(过滤器适用)。
添加 -ct 以在创建线程时创建转储文件。
添加 -et 以在线程退出时创建转储文件。
-f 在异常内容、调试日志和 DLL 加载/卸载的文件名上进行过滤(include)。支持通配符(*)。
-fx 在异常内容、调试日志和 DLL 加载/卸载的文件名上进行过滤(exclude)。支持通配符(*)。
-g 在托管进程中作为本地调试器运行(无互操作)。
-h 如果进程有一个挂起的窗口(至少 5 秒钟未响应窗口消息),则写入转储文件。
-k 在克隆(-r)之后或转储收集结束时终止进程。
-l 显示进程的调试日志记录。
-m 用于创建转储的内存提交阈值(MB)。
-ml 当内存提交低于指定的MB值时触发。
-n 退出前要写入的转储数。
-o 覆盖现有转储文件。
-p 当性能计数器达到或超过指定的阈值时触发。某些计数器和/或实例名称可能区分大小写。
-pl 当性能计数器低于指定阈值时触发。
-r 使用克隆进行转储。并发限制是可选的(默认为 1,最大为 5)。
使用克隆(-r)时,操作系统不支持内核转储(-mk)。警告:高并发值可能会影响系统性能。
Windows 7:使用 Reflection。操作系统不支持 -e
Windows 8.0:使用 Reflection。操作系统不支持 -e
Windows 8.1+:使用 PSS。支持所有触发器类型。
-s 写入转储之前的连续秒数(默认值为10)。
-t 进程终止时写入转储。
-u 相对于单个核心处理 CPU使用率(与-c 一起使用)。
-v 仅调试: 详细输出。
-w 如果指定的进程没有运行,请等待它启动(未运行程序之前使用procdump)。
-wer 将(largest)转储加入到 Windows 错误报告队列中。
-x 使用可选参数启动指定的映像。如果它是一个 Store 应用或包,
则 ProcDump 只会在下一次激活时启动(仅限)。
-y HIDDEN:商店应用程序激活。
-64 默认情况下,当在64位Windows上运行时,ProcDump将捕获32位进程的32位转储。
此选项将覆盖以创建64位转储。仅用于WOW64子系统调试。

1.5 许可协议

Procdump是一款由Sysinternals开发的免费工具,其使用许可协议如下:

  1. 授权范围:免费授权给任何个人或组织使用。
  2. 限制条件:
    1. 未经授权不得以任何形式修改或重编译Procdump。
    2. Procdump只能用于个人或组织内部使用,不得用于商业目的或向第三方提供。
    3. Procdump不得用于违反任何法律法规的活动。
    4. Sysinternals不承担因使用Procdump而产生的任何责任。
  3. 所有权:Procdump版权归Sysinternals所有。
  4. 终止:Sysinternals保留随时终止授权的权利。
  5. 其他条款:本许可协议不得被解释为Sysinternals与用户之间的任何形式的合同、伙伴关系或代理关系。本协议受美国法律管辖。任何争议均应提交美国华盛顿州法院解决。
  • -accepteula参数是用于在启动Procdump时自动接受最终用户许可协议(EULA)的选项。
  • 在第一次使用Procdump时,如果没有指定此参数,会弹出一个窗口,如下图所示,需要手动接受EULA才能使用该工具。
  • 使用-accepteula参数可以在不需要手动接受EULA的情况下启动Procdump,从而方便自动化部署和集成。

C++(Qt)软件调试---学会使用ProcDump(5)_第9张图片

C++(Qt)软件调试---学会使用ProcDump(5)_第10张图片

1.6 自动终止

  • 语法:

    -cancel <Target Process PID>
    
  • 当使用procdump监视一个程序时,像停止监视,有两种解决办法;

    • 在启动命令行的cmd窗口按Ctrl + C就可以终止监视;

      C++(Qt)软件调试---学会使用ProcDump(5)_第11张图片

    • 第二种方法就是使用-cancel,由于procdump运行时cmd窗口处于阻塞状态,所以需要重新打开一个cmd窗口;

    • 使用procdump -cancel 1036命令终止procdump监视的程序;

    • 其中1036为监视程序的PID值,可在下图中位置看到;

      C++(Qt)软件调试---学会使用ProcDump(5)_第12张图片

      C++(Qt)软件调试---学会使用ProcDump(5)_第13张图片

1.7 dump文件名格式

  • 在使用procdump时不指定生成dump文件名时默认生成的dump文件名为: PROCESSNAME_YYMMDD_HHMMSS.dmp

    C++(Qt)软件调试---学会使用ProcDump(5)_第14张图片

  • 支持以下替换:

    替换 说明
    PROCESSNAME 可执行程序名
    PID 进程 ID
    EXCEPTIONCODE 异常代码
    YYMMDD 年/月/日
    HHMMSS 小时/分钟/秒
  • 在命令行中使用对应的字符串替换就可以,例如:

    C++(Qt)软件调试---学会使用ProcDump(5)_第15张图片

1.8 使用示例

  1. 使用procdump时只输入部分字符,会根据输入的字符去匹配一个正在运行的,程序名称中包含该字符的程序,并立即生成一个dump文件。(只匹配一个程序)

    procdump un
    procdump qt
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第16张图片

  2. 使用PID值来捕获进程的完整转储,如下图所示,捕获PID值为15752的QQ程序的dump,使用了-ma参数生成的dump文件比没有使用的大几十倍。

    • 为什么可以用程序名称也可以用PID呢?因为如果当一个程序启动多次是,使用程序名称procdump不知道去匹配哪一个,而PID是唯一的。
    procdump 15752
    procdump -ma 15752
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第17张图片

  3. 同时使用-mm -ma参数可以同时生成一个Mini Dump和一个Full Dump。

    procdump -mm -ma 15752
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第18张图片

  4. 使用下列命令匹配一个正在运行的程序名中包含qt字符串的程序,并以5秒间隔创建3个Dump文件。

    procdump -n 3 -s 2 qt
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第19张图片

  5. 使用下列命令可以监测名为ScreenToGif的进程,如果进程的CPU占用率超过10%,并程序5秒则生成Dump,生成3个Dump后退出监测。

    procdump -n 3 -s 5 -c 10 ScreenToGif
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第20张图片

  6. 使用下列命令可以监测名为untitled5.exe的进程,如果该进程超过5秒未响应,则生成一个Dump。

    procdump -h untitled5.exe
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第21张图片

  7. 使用下列命令可以监测名为untitled5.exe的进程,如果该进程超过5秒未响应,则生成一个Mini Dump,一个Full Dump。

    procdump -h -mm -ma untitled5.exe
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第22张图片

  8. 使用下列命令可以监测系统CPU总使用率,如果超过40%,并且持续10(经过测试-s没生效,只要CPU超过40%则立即生成Dump),则生成进程untitled5的Dump文件;

    procdump untitled5 -s 10 -p "\Processor(_Total)\% Processor Time" 40
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第23张图片

  9. 使用下列命令当 监测进程untitled5 的句柄计数,如果句柄计数超过 1000 时,生成名为“untitled5 ”的进程的Full Dump:

    • 我在程序中循环创建1000个button,就拥有了1000个窗口句柄,而untitled5程序本身就有一些句柄,所以就超过了1000个。
    procdump -ma untitled5 -p "\Process(untitled5)\Handle Count" 1000
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第24张图片

    C++(Qt)软件调试---学会使用ProcDump(5)_第25张图片

  10. 下列这条命令的意思是:当同时启动了多个(我这里是两个)名为untitled5的进程时,监听第0个(#后面是第几个,从0开始)进程的句柄数,如果句柄数超过1000,则生成PID为15684的进程的Full Dump。

    procdump -ma 15684 -p "\Process(untitled5#0)\Handle Count" 1000
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第26张图片

    C++(Qt)软件调试---学会使用ProcDump(5)_第27张图片

    注意:多个实例计数器
    如果计数器有多个实例,则需要包含名称和/或实例编号,语法如下:

    \Processor(NNN)\% Processor Time                 // 使用实例(运行的程序)编号,从0开始
    \Thermal Zone Information(<name>)\Temperature    // 使用实例 名称
    \Process(<name>[#NNN])\                 // 使用实例 名称#编号
    

    旧 OS 要求追加计数器的 PID \Process 。(未验证)

    \Process(<name>[_PID])\<counter>
    

    提示: 使用 性能监视器 查看计数器 (区分大小写) 。(未验证)
    提示: 对于 \Process(*) 基于的计数器,请使用 PowerShell 将 PID 映射到其 #NNN

    Get-Counter -Counter "\Process(*)\ID Process"
    
  11. 使用下列命令可以在第二次机会异常(例如C#控制台程序)时生成Full Dump,如果程序不存在第二次异常则在第一次异常时生成(例如C++程序);

    • 如果第一次机会异常被try捕获后在catch中丢弃了,则不存在第二次机会异常,就不会生成Dump。
    procdump -ma -e  ConsoleApp1
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第28张图片

  12. 使用下列命令可以为第一次或第二次机会异常生成Full Dump:

    procdump -ma -e 1 ConsoleApp1
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第29张图片

    C++(Qt)软件调试---学会使用ProcDump(5)_第30张图片

  13. 为调试字符串消息编写完整转储:(没成功)

    procdump -ma -l w3wp.exe
    
  14. 在C#窗口程序中如果发生异常,捕获异常后会弹出一个窗口,点击【继续】后程序不会退出,这时使用下列命令可以在每次发生异常时生成一个Full Dump,当生成3个后procdump退出监测。

    • 而C++程序发生异常时就直接退出了,所以使用这条命令会连续生成3个Full Dump。
    procdump -ma -n 3  -e 1 WindowsForms
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第31张图片

  15. 如下图所示,C#程序发生异常时会显示异常信息,可以使用过滤器-f过滤掉不需要的异常,只有当过滤器指定的异常出现时才生成Dump;(也可以是其它过滤条件)

    procdump -ma -n 3  -e 1 -f DivideByZeroException  WindowsForms          // 除0异常
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第32张图片

    C++(Qt)软件调试---学会使用ProcDump(5)_第33张图片

    C++(Qt)软件调试---学会使用ProcDump(5)_第34张图片

  16. 如果调试字符串消息包含“NotFound”,则最多可写入10个完整转储:(没成功)

    procdump -ma -n 10 -l -f NotFound w3wp.exe
    
  17. 有时候我们想在程序还没有运行的使用启动procdump监测,例如:有时候异常会发生在程序启动时,如果在程序启动后再运行Procdump就根本来不及,所以可以使用-w参数让procdump运行起来等待目标程序的启动。

    • 可用于监测程序启动时发生的异常
    procdump -e -w untitled5
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第35张图片

  18. 使用下列命令可以在procdump开始运行时使用参数-x启动位于./路径下的程序untitled5.exe,并在程序异常时生成Dump;

    • 注意:路径./和程序名称untitled5.exe直接要有空格。
    • 可用于监测程序启动时发生的异常
    procdump -e -x ./ untitled5.exe
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第36张图片

  19. 注册以启动并尝试激活存储“应用程序”。新的ProcDump实例将在激活时启动:(没尝试)

    procdump -e -x c:\dumps Microsoft.BingMaps_8wekyb3d8bbwe!AppexMaps
    
  20. 注册以启动应用商店“程序包”。新的ProcDump实例将在(手动)激活时启动:(没尝试)

    procdump -e -x c:\dumps Microsoft.BingMaps_1.2.0.136_x64__8wekyb3d8bbwe
    
  21. 在不写入Dump的情况下显示WindowsForm程序的异常代码/名称:

    • 注意:对C#这类存在第一次机会异常、第二次机会异常的程序有效,对于C++程序在程序出现异常时还是会生成Dump。
    procdump -e 1 -f "" WindowsForm
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第37张图片

  22. Windows 7/8.0版本;使用反射减少5个连续触发的中断:(未尝试)

    procdump -r -ma -n 5 -s 15 wmplayer.exe
    
  23. Windows 8.1+;使用 PSS 减少 5 个并发触发器的中断:(未尝试)

    procdump -r 5 -ma -n 5 -s 15 wmplayer.exe
    

1.9 安装使用方式语法使用示例

  1. 是使用下列命令可以安装ProcDump作为(AeDebug)后期调试程序,将生成的Dump文件全部放到E:\dumps文件夹下;

    procdump -ma -i E:\dumps
    
    • 如下图中出现的两次失败第一次是因为指定的E:\dumps文件夹不存在,第二次是因为打开的cmd窗口权限不足,需要使用管理员方式打开。

    C++(Qt)软件调试---学会使用ProcDump(5)_第38张图片

    • 如下图所示,使用管理员身份打开cmd后运行就按安装成功了,但是图中显示修改了两处注册表,不出意外的话每次生成的Dump文件会有2个,这个不用去管。

    C++(Qt)软件调试---学会使用ProcDump(5)_第39张图片

    • 如果安装procdump时不指定路径则生成的Dump可能会存在于下面两个文件夹中;

      procdump -ma -i
      
      • C:\Users\mhf\AppData\Local\CrashDumps
      • C:\Windows\System32
  2. 卸载ProcDump作为(AeDebug)后期调试程序:

    procdump -u
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第40张图片

1.10 显示示例命令行列表

procdump -? -e

C++(Qt)软件调试---学会使用ProcDump(5)_第41张图片

4、Ubuntu下使用ProcDump

1.1 使用语法

  • 可以使用进程程序的程序名称和进程ID进行监测。
  • 注意: 在linux下使用procDump都要使用sudo
procdump [-n Count]
         [-s Seconds]
         [-c|-cl CPU_Usage]
         [-m|-ml Commit_Usage]
         [-tc Thread_Threshold]
         [-fc FileDescriptor_Threshold]
         [-sig Signal_Number]
         [-e]
         [-f Include_Filter,...]
         [-pf Polling_Frequency]
         [-o]
         [-log]
         {
          {{[-w] Process_Name | [-pgid] PID} [Dump_File | Dump_Folder]}
         }

1.2 参数

选项 说明
-n 退出前要写入的转储数。
-s 写入转储之前的连续秒数(默认值为10)。
-c CPU阈值,超过该阈值可创建进程的转储。
-cl CPU阈值,低于该阈值可创建进程的转储。
-m 用于创建转储的内存提交阈值(MB)。
-ml 当内存提交降至指定的MB值以下时触发。
-tc 线程计数阈值,超过该阈值将创建进程的转储。
-fc 文件描述符计数阈值,超过该阈值可创建进程的转储。
-sig 要拦截的信号,以创建进程的转储。(例如程序段错误会发出SIGSEGV信号)
-e [.NET]当进程遇到异常时创建转储。
-f [.NET] 对(逗号分隔)异常名称和异常消息进行筛选(包括)。
-pf 轮询频率。
-o 覆盖现有转储文件。
-log 将扩展的ProcDump跟踪写入系统日志。
-w 如果指定的进程没有运行,请等待它启动。
-pgid “进程ID”指的是进程组ID。
  • Linux中详细信号说明
  • Linux中常见程序退出信号有以下几种:
信号 编号 说明
SIGABRT 6 由abort函数发出的信号,表示进程异常终止。
SIGFPE 8 由浮点运算异常发出的信号,表示进程执行了一个不合法的浮点运算。
SIGILL 4 由非法指令发出的信号,表示进程执行了一个非法指令。
SIGINT 2 由CTRL+C发出的信号,表示进程接收到了一个中断信号。
SIGSEGV 11 由段错误发出的信号,表示进程访问了一个非法的内存地址。
SIGTERM 15 由kill命令发出的信号,表示进程被终止。
SIGKILL 9 由kill -9命令发出的信号,表示强制杀死进程。

1.3 使用示例

  1. 如果想通过PID进行监测,可以使用下列命令查询可执行程序的PID值;

    ps aux | grep testCore             # testCore是程序名称
    
  2. 使用下列命令立即创建Core文件

    sudo procdump testCore           # 这里演示使用程序名称
    或者
    sudo procdump 851017
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第42张图片

    C++(Qt)软件调试---学会使用ProcDump(5)_第43张图片

  3. 由下图所示,procdump默认生成的Core都很大

    C++(Qt)软件调试---学会使用ProcDump(5)_第44张图片

  4. 使用下列命令将创建2个核心转储,间隔10秒。

    sudo procdump -n 2 851017
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第45张图片

  5. 使用下列命令将创建2个核心转储,间隔5秒。

    sudo procdump -n 2 -s 5 851017
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第46张图片

  6. 使用下面的命令将在进程每次CPU使用率>= 65%时创建一个核心转储,最多3次,每次转储之间至少间隔10秒。

    sudo procdump -c 65 -n 3 1234
    
  7. 以下代码将在进程每次CPU使用率>= 65%时创建一个核心转储,最多3次,每次转储之间至少间隔5秒。

    sudo procdump -c 65 -n 3 -s 5 1234
    
  8. 当CPU使用率超出范围[10,65]时,以下代码将创建一个核心转储。

    sudo procdump -cl 10 -c 65 1234
    
  9. 当CPU使用率为>= 65%或内存使用率为>= 100 MB时,以下命令将创建一个核心转储。

    sudo procdump -c 65 -m 100 1234
    
  10. 下面的操作将立即在~/目录中创建一个核心转储,如果目录不存在则创建失败。

    sudo procdump 871634 ~/
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第47张图片

  11. 下面的命令将在当前目录中创建一个名为testCore.871634的核心转储。

    • 如果使用-n,则因为testCore.871634文件名已经存在,无法被覆盖,则后面的Core文件不会生成。(这里和官方文档不一样)
    sudo procdump 871634 testCore
    

    C++(Qt)软件调试---学会使用ProcDump(5)_第48张图片

  12. 下面的代码将在发生SIGSEGV(段错误)时创建一个核心转储。

    • 遗憾的是-sig每次只能监测1个信号。
    sudo procdump testCore -sig 11
    

  13. 当目标【.NET】应用程序抛出System.InvalidOperationException时,以下内容将创建核心转储。

    sudo procdump -e -f System.InvalidOperationException 1234
    
  14. include筛选器支持部分匹配和通配符匹配,因此下面也将为System.InvalidOperationException创建一个核心转储。

    sudo procdump -e -f InvalidOperation 1234
    

    或者

    sudo procdump -e -f "*Invali*Operation*" 1234
    
  15. 下面将等待一个名为testCore的进程,并在找到它时立即创建一个核心转储。

    • 注意:这个功能有一点小问题,在创建完成Core后procdump不会自动退出,按Ctrl + C退出即可。
    sudo procdump -w testCore
    

5、总结

通过本文的学习,我们了解了procdump的基本概念和使用方法,可以方便地在Linux/Windows系统中对进程进行转储和诊断。

procdump是一款非常实用的工具,可以帮助开发人员快速定位和解决问题。

虽然还有一部分命令功能不明确,但基本可以满足日常开发调试的需求了。

你可能感兴趣的:(#,C++软件调试,qt,c++,procdump,Dump,软件调试)