1.应用程序验证器(Application Verifier)简介
说明:Application Verifier是来自微软官方的一款应用程序验证工具,主要用于帮助用户检测和调试内存损坏、危险的安全漏洞、Run-time检测等;是一款辅助开发工具,不用修改源码;在程序退出时报告未释放的资源等,程序正常退出才会有报告
获取:可以通过windows software development Kit 管理器来下载最新版
推荐:应用程序验证器和WinDbg在很多场景下配合使用
原理:hook掉分配和释放资源的API,做一些检查和记录
2.Application Verifier使用
应用程序验证程序 - 概述 - Windows drivers | Microsoft Learn
点击Add Application加载exe文件后,再点击Save即可:
3. WinDbg使用
WinDbg (用户模式) 入门 - Windows drivers | Microsoft Learn
使用Windbg静态分析dump文件的一般步骤及要点详解_windebug分析dump-CSDN博客
常用指令:
.reload /f xxx.exe 强制加载xxx.exe对应的xxx.pdb
lm vm xxx* 查看是否已加载xxx.exe、xxx.pdb
g 执行
kn 堆栈信息
!analyze -v 问题自动排查
4.Application Verifier配合WinDbg使用
调试工具:应用程序验证器Application Verifier一页纸(appverif+WinDbg+gflags)- 详细版-CSDN博客
以1个堆内存释放二次的错误为例,体现Application Verifier配合WinDbg使用相比于WinDbg单独使用的优势:
heap_test.cpp
#include <stdio.h>
void main(int argc, char* args[]) {
char* psz = NULL;
psz = new char[10];
printf("22222222222222222");
delete[] psz;
delete[] psz; //二次释放
//int a = 12;
//int b = 0;
//printf("111111111111111");
//int c = a / b;
//printf("c = %d", c);
printf("3333333333333333");
int a = 12;
int b = 12;
int c = 12;
int d = 12;
int e = 12;
int f = 12;
printf("4444444444444444");
return;
}
① 只用WinDbg调试
可以看到是因为指令异常中断到调试器(错误码0x80000003
),但提示信息没什么价值。
② Application Verifier配合WinDbg调试
这次报Access violation - code c0000005,结合报错行数为heap_test.cpp的第16行,可以看到是因为指针psz被释放了两次。