1、IDE开发工具直接调试
VS调试:
Debug调试
Release调试(关闭优化)
模块代码附加到exe进程上调试
VS调试技术:
对0xCCCCCCCC、0xCDCDCDCD、0xFEEEFEEE异常值的识别
弹出终止调试的提示框,点击重试,VS中断下来查看函数调用堆栈
断点调试
人为添加if条件过滤语句,在if语句体中设置断点
数据断点,检测内存被何处篡改
调试时跳过IsBadReadRPtr或IsBadWritePtr引发的异常中断
调用OutputDebugString系统API接口,将日志输出到输出的窗口中
附加到进程调试
查看汇编代码上下文,去辅助分析
VS中看不到函数调用堆栈或者看不到有效的函数调用堆栈,可以尝试用Windbg进行动态调试,能看到有效的函数调用堆栈(我们多次遇到这个问题,比如Stack overflow异常)
2、添加打印日志
通过运行日志看到程序的执行轨迹,查看关键变量的值去辅助分析
将运行日志和相关变更的输出到调试器的输出窗口上调用API函数OutputDebugString
将日志输出到文件
3、数据断点
监测变更的内存何时被篡改:
可以在IDE开发工具中设置数据断点
也可以Windbg等调试器中设置断点
4、添加异常捕获防止耐破崩溃
可以捕获代码中throw出的异常,包含数字值和抛出异常类,比如我们在操作COM组件时需要添加异常保护,防止程序在COM组件内部抛出异常引发崩溃
使用rty...catch(C++版本)
使用rty...except(C版本)
5、分块注释代码
多次分行或分块注释代码,定位引起问题的代码块
6、历史版本比对法
使用二分法比对历史版本,确定哪天开始出现问题
检查出问题的时间点前一天提交的代码,或者底层库的发布记录
最终确定是前一天修改代码引发的,还是底层发布的库引起的
历史版本比对法,需要依赖完备的编译及版本维护系统
7、Windbg分析与设计
Windbg静态分析dump文件:
查看异常类型码,确定异常类型
查看发生崩溃的那条汇编指令及相关寄存器的值
想看崩溃的那条汇编指令及相关寄存器的值
查看崩溃时的函数调用堆栈
查看函数调用堆栈中的函数名称及代码的行号,找到对应的C++源码,分析源码上下文
在Windbg中查看局部变更或者C++类对象中的成员变更的值,可能是关键线索
Windbg动态调试目标进程:
没有dump文件或者dump文件看不到有效信息,可以尝试将Windbg附加到目标进程上动态调试
可以设置断点
可以设置数据断点
8、IDA反汇编工具
在想看函数调用堆栈无法定位问题时,或者要搞清楚崩溃的根本原因,可以使用IDA去查看汇编代码去分析
查看二进制文件的汇编代码上下文,与C++源码结合起来分析
9、借助常用分析工具分析
SPY++-查看窗口信息及Windows消息,用于排查窗口相关的问题
Dependency Walker-查看库与库之间的依赖关系,用于排查程序启动报错或者dll库动态加载失败的问题
Clipbrd-剪切板查看器,做剪切板编程时会用到
GDIView-查看GDI对象占用情况,排查GDI对象泄漏问题
Process Explorer-查看进程库加载信息及线程等信息
Process Hacker-和Procss Explorer功能类似
Process Monitor-监测目标程序的文件操作活动和注册表操作活动
API Monitor-监测程序对系统库或第三方库的API接口的调用情况估计一些软件的功能实现方法
Windbg-静态分析dump文件与动态调试目标进程
IDA Pro-反汇编工具,查看二进制文件的汇编代码上下文,辅助分析软件异常
WirShark-分析网络数据包,排查网络故障,排查业务流程的异常
clumsy-网络摸拟工具,可以模拟维普网环境,复现部分问题