沃德软件技术资讯频道

传递网站建设与软件开发资讯

C#\JAVA\IOS\Android等技术研究

Ajax+DIV+CSS技术技巧/HTML5研究

视觉设计、软件体验度与流行趋势

沃德软件团队经验与心得体会分享

门户网站设计有很多种。最为国人熟知的是像迅雷看看、新浪、腾讯网那种信息类门户。现在也有博客门户等。...[详细]
软件开发

排查C++软件异常的手段与方法

发布:昆明沃德软件 发布时间:2024-11-05  浏览次数:47
更多
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-网络摸拟工具,可以模拟维普网环境,复现部分问题