文章目录
- 1、介绍
- 1、安装
- 2、配置需要验证的项目
- 2、在WinDbg中调试
- 3、其他配置项
1、介绍
AppVerifier 特别用于检测和帮助调试内存损坏、危险的安全漏洞以及受限的用户帐户特权问题。
AppVerifier 有助于创建可靠且安全的应用程序,方法是监视应用程序与Windows操作系统的交互,并配置应用程序使用的对象、注册表、文件系统和 Win32 API(包括堆、句柄和锁)。
官方文档:https://docs.microsoft.com/zh-cn/previous-versions/aa480483(v=msdn.10)?redirectedfrom=MSDN#E3AA
1、安装
下载ApplicationVerifier.xx.msi进行安装
2、配置需要验证的项目
1)打开appverifier,选择File–Add Application添加应用程序,之后点击Save按钮;对于开发人员,直接选择工程中输出的Debug版的可执行文件,可以添加多个文件,也可以添加动态库DLL。
2)选择测试属性
Basic基本验证项说明
名称 | 说明 |
---|---|
Exceptinons | 防止程序做这样的操作,比如程序用异常捕获,以防止错误继续抛出。 |
Handles | 检测句柄错误 |
Heaps | 检测内存中的堆栈错误 |
leak | 应用程序是否在资源不足的情况下用尽了内存 |
Locks | 检测锁使用情况,确定应用程序是否正确的使用关键段 |
Memory | 检测应用程序虚拟内存使用情况 |
SRWLock | 检测读写锁使用是否正确 |
ThreadPool | 监控线程池使用,线程池的线程不应该被应用程序关闭 |
TLS | 检测线程局部存储api是否被正确使用 |
3)选择Tests下的某一项测试验证项,右键弹出属性和停止验证选项
属性页如下:
停止验证选项页如下:
点击对应的Verifier stop值,在下方的Description中会出现该停止码的描述说明
也可通过下面步骤或按住F1键打开帮助文档查看停止码描述
4)Appverify有2组属性,一组是测试验证项属性,一组是应用程序属性
名称 | 说明 |
---|---|
Name | 针对每个属性的唯一名称 |
Type | Boolean、DWORD、String 和 MultipleString |
Value | 基于类型变化的可更改元素 |
Description | 该描述解释属性的内容 |
双击应用程序属性不可修改,双击测试验证项属性可修改
应用程序属性如下:
名称 | 类型 | 值 | 描述 |
---|---|---|---|
Propagate | Boolean | FALSE | 将验证器设置从父进程传播到子进程。注意,并非所有测试都可以传播。False(不选中该框)不传播这些设置,而 True(选中该框)则传播这些设置 |
AutoClr | Boolean | FALSE | 当指定的图像开始运行之后,验证的图像将清除自己的设置。False(不选中该框)不进行此操作;True(选中该框)则进行此操作 |
AutoDisableStop | Boolean | TRUE | AppVerifier 对于一个错误将只解释一次。如果再次发现该问题,它不会生成错误。False 在每次发现问题时都将生成错误。True 将只生成一个错误 |
LoggingWithLock | Boolean | TRUE | 将记录 dll 加载/卸载事件。验证器在加载器锁处于保持状态时进行 I/O。这可能会挂起应用程序。False 不会记录该事件,而 True 将记录该事件 |
ExceptionOnStop | Boolean | FALSE | 对于每个验证者报告的停止,将引发异常而不是调试中断 |
MinimumMemoryOverhead | Boolean | FALSE | 通过禁用一些仅用于调试的特性来减少内存开销 |
2、在WinDbg中调试
准备好exe和对应的pdb,这里不做详细说明
若进程有异常,AppVerifier或向windbg调试器发出的异常情况可根据停止码与错误原因判断异常类型
获取停止码:
1)方式1
2)方式2
打开appverifier界面,查看Logs页面
找出Error值非0的日志进行保存"Save As"到指定目录,到目录打开xml文件
3、其他配置项
1)勾选Inative,在调试时会得不到任何停止码的调试信息
2)严重程度调整为Warning
当发现异常的时候,在Logs中查看Warning会变成1
查看日志,多了Severity参数
其他的不做说明
3)日志记录选项说明
名称 | 说明 |
---|---|
severity | 严重程度,以下严重程度依次增加,error严重程度最大 |
ignore | 忽视,严重程度可以忽视,此影响对程序的影响可以忽略 |
information | 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。 |
warning | 输出警告信息;表明会出现潜在错误的情形 |
Error | 输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行 |
error reporting | 错误报告 |
Log to File | 将日志记录进文件中 |
Log Stack Trace | 记录回溯信息,此选项记录前提是Log to File记录 |
No Break | 不间断 |
Exception | 异常 |
BreakPoint | 断点 |
miscellaneous | 混杂选项 |
stop Once | 停一下 |
Not Continuable | 不连续,停多次 |