目录
2、模块依赖关系查看工具 Dependency Walker
C++软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达8000多个,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C++实战专栏(重点专栏,专栏文章已更新500多篇,订阅量已达6000多个,欢迎订阅,持续更新中...)
https://blog.csdn.net/chenlycly/article/details/140824370C++ 软件开发从入门到实战(重点专栏,专栏文章已更新300多篇,欢迎订阅,持续更新中...)
https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)
https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)
https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)
https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)
https://blog.csdn.net/chenlycly/category_2276111.html 在C++软件开发和维护的过程中,可以使用一些高效的软件分析工具去辅助分析和排查软件运行中遇到的各式各样的问题,今天就把我在日常开发调试工作中用的一系列工具分享给大家。常用的软件分析工具有SPY++、Dependency Walker、剪切板查看工具Clipbrd、 GDI对象查看工具GDIView、Process Explorer、Process Monitor、API Monitor、调试分析工具Windbg、交互式反汇编工具IDA等,有了这些工具,我们可以高效快速地排查和定位软件问题。本文详细讲述这些工具的用途,并给出有实战参考价值的实战分析实例,供大家借鉴或参考。
1、窗口信息查看工具 SPY++
Spy++是微软Visual Studio开发环境中一个用于监视Windows消息和窗口信息的工具,它能够提供一个图形化的界面来查看当前运行的Windows应用程序的层次结构,并且能够显示窗口句柄、类名、消息等信息。通过Spy++,开发者可以查看消息被发送到哪个窗口,以及窗口如何响应这些消息,这对于调试和学习Windows程序界面和消息传递机制非常有帮助。
我们在日常工作中,主要使用SPY++查看窗口信息,比如窗口句柄、窗口坐标尺寸大小、窗口风格、窗口类、窗口的父子关系等。比如在视频软件中,视频窗口用于显示视频图像(将一帧一帧视频图像绘制到视频窗口上),当视频显示异常时,可以用SPY++探查UI界面中的窗口句柄,和底层音视频编解码模块中的窗口句柄值是否一致。在需要时,可以查看视频窗口的坐标与大小尺寸。
再比如,我们在研究其他软件实现某一UI界面效果时,可以查看该UI界面窗口使用什么窗口风格,也可以看到UI窗口的窗口类,猜测出UI界面是用哪个界面库实现的(常用的界面库有MFC、duilib和QT)。
关于Windows常用窗口风格的说明,可以查看我之前写的文章:
C++ Win32界面编程中的窗口风格要点总结https://blog.csdn.net/chenlycly/article/details/121572701 之前在某个定制项目中要实现桌面区域共享功能时,使用SPY++查看友商软件的区域共享选择窗口的属性,大概地猜测出友商实现该共享选择窗口的思路,相关案例详细记录,可以查看我的文章:
使用Layered分层窗口实现视频会议中的桌面区域共享(使用分层窗口将部分区域透掉,鼠标可穿透)https://blog.csdn.net/chenlycly/article/details/140733610
2、模块依赖关系查看工具 Dependency Walker
Dependency Walker(简称 Depends)是一款用于分析Windows可执行文件(如 .exe、.dll等)依赖关系的工具。它可以帮我们查看二进制模块之间的依赖关系,使用时只需要将目标二进制文件拖到Dependency Walker中,可以该二进制模块都依赖了哪些dll库,并且调用了依赖库中的哪些接口。主要用于排查因为缺少dll库或者在依赖的dll库中找不到接口导致exe启动失败或者dll库加载失败的问题。
当启动exe程序时,如果找不到依赖的dll库(在运行的电脑上找不到),则会如下类似的错误:
如果在依赖的dll库中找不到调用的接口,则会报如下类似的错误:
对于这类问题,排查起来很简单,直接将exe主程序文件拖到Dependency Walker中,去查看模块的依赖关系。如果依赖的库找不到,在对应的节点前会显示黄色问号标识,如下所示:
如果在依赖的dll库中找不到调用的接口,则在对应节点前显示红色的标识,如下所示:
此外,除了exe程序启动报错,动态加载的dll库可能也会因为找不到依赖的dll库找不到或者在依赖的dll库中找不到接口而加载失败,我们在项目中遇到过多次了。动态加载的dll库加载失败,不会弹出报错提示框,我们需要通过业务异常或者打印日志去怀疑动态加载的库没有加载起来。然后使用Process Explorer查看exe主程序加载的dll库列表,如果列表中找不到动态加载的库,则可以确定动态加载失败。排查方法是一样的,只要把动态加载的dll库拖入Dependency Walker中查看依赖关系,就可以确定原因了。
使用Dependency Walker排查问题的实战分析案例,可以查看我之前写的文章:
使用Dependency Walker和Process Explorer排查瑞芯微工具软件RKPQTool.exe启动报错的问题https://blog.csdn.net/chenlycly/article/details/140731614使用Dependency Walker和Beyond Compare快速排查dll动态库损坏或被篡改的问题
https://blog.csdn.net/chenlycly/article/details/146309241使用Process Explorer、Dependency Walker和PE信息查看工具快速排查dll动态库因库与库版本不一致导致的加载失败问题
https://blog.csdn.net/chenlycly/article/details/146170148 此外,我之前对DLL动态库加载失败导致程序启动报错以及DLL库加载失败的原因进行了详细的分析与总结,可以查看文章:
3、GDI对象查看工具 GDIView
GDIView是一个用于监控和分析Windows系统中GDI对象占用的工具。GDI是Windows 操作系统的核心图形子系统,负责处理图形绘制、字体渲染、位图操作等任务。
常见的GDI对象有DC设备上下文、Bitmap位图、Font字体、Brush画刷、Pen画笔、Region区域等,绘制窗口时会用到这些GDI对象。
GDIView工具主要用来排查GDI泄漏导致的UI界面绘制异常的问题。所谓GDI对象泄漏,就是绘图时创建的GDI对象,在绘制完成后没有销毁GDI对象,这样就导致了GDI泄漏。持续的泄漏,就会导致程序进程占用的GDI对象越来越多,当达到或接近进程占用的GDI对象1万个上限时,会导致GDI绘图API函数绘图失败,导致界面显示异常。
如果UI界面显示不正常,窗口绘制异常,可能是软件进程占用的GDI对象总数异常高导致的。这类问题我们在项目中多次遇到了,一般是使用GDI对象绘图时有GDI对象泄漏导致的。对于此类问题,可以先打开Windows任务管理器,看看目标进程的GDI对象总数是不是异常的高:
如果GDI对象占用总数过高,基本就可以确定是GDI对象泄漏了,打开GDIView,看到底是哪种GDI对象占用高:
这样排查起来会比较有针对性。但光知道发生泄漏的GDI对象类型,可能还是较难定位问题。可能软件从上到下有很多模块,不确定GDI对象泄漏发生在哪个模块。此外,可能发生泄漏的代码平时很难被频繁的执行,只是在某种特定的场景下才会被频繁地执行,这种情况比较具有隐蔽性,或者是这个问题隐藏的比较深。这两类比较有代表性的问题场景,我们在项目中都遇到过。
所以,除了使用GDIView工具之外,可能还需要结合历史版本比对法(下面给出的案例会讲到历史版本比对法),找到发生泄漏的时间点,到svn或git上查看前一天提交的代码或者底层发布过来的模块,可能就能找到引发问题的代码点了。
之前写过多篇排查GDI对象泄漏的案例,可以去查看这些文章:
使用GDIView工具排查GDI对象泄漏问题(实战分析案例) https://blog.csdn.net/chenlycly/article/details/125399896使用GDIView工具排查GDI对象泄漏案例的若干细节总结(历史版本比对法)
https://blog.csdn.net/chenlycly/article/details/141526436使用GDIView工具排查GDI对象泄漏导致C++程序UI界面绘制异常的问题
https://blog.csdn.net/chenlycly/article/details/140731065可以到GDIView等工具官网上或者微软MSDN上查看文档化说明去解决问题
https://blog.csdn.net/chenlycly/article/details/139565010使用GDI对象绘制UI时需要注意的若干细节问题总结
https://blog.csdn.net/chenlycly/article/details/144233359
在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)
专栏1:(该精品技术专栏的订阅量已达到8000多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,已经更新到200篇以上!欢迎订阅!)
C++软件调试与异常排查从入门到精通系列文章汇总https://blog.csdn.net/chenlycly/article/details/125529931
本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!
考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!
专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!
专栏2:(本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,订阅量已达6000多个,专栏文章已经更新到500多篇,持续更新中...)
C/C++实战进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html
以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据结构与算法、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。
专栏3:
C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795
常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!
专栏4:
VC++常用功能开发汇总(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/124272585
将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。
专栏5:
C++ 软件开发从入门到精通(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12695902.html
根据多年C++软件开发实践,详细地总结了C/C++软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。
4、剪切板查看工具 Clipbrd
Clipbrd可以查看复制内容时都生成了哪些剪切板数据格式,这个工具在实现与PC版微信、企业微信及QQ等IM软件之间剪切板对通功能时很有用。比如我们在PC版微信中复制图片和文字等混合内容时,打开Clipbrd,点击菜单栏中的查看,就会显示当前微信复制内容时设置了哪些剪切板数据格式,如下所示:
可以看到微信私有的WeChat RichEdit Format剪切板格式以及通用的HTML Format通用剪切板格式。我们可以编写测试代码,打开剪切板,从剪切板中读出这些剪切板格式数据,研究这些数据的构造格式。
之前深入研究了复制文字与图片的混合内容到QQ、PC版微信以及企业微信中的剪切板数据对通问题,详细地展现了与这些IM软件进行剪切版对通时遇到的诸多细节问题以及解决办法,可以查看我的长篇文章:(文章中还分享了获取剪切板)
复制文字与图片的混合内容到QQ、PC版微信以及企业微信中的剪切板数据对通深入研究及问题解决总结https://blog.csdn.net/chenlycly/article/details/147134261该工具使用场景比较有限,主要用于剪切版对通的场景中。
5、进程信息查看工具 Process Explorer
Process Explorer是Winternals公司(该公司已经被微软收购)开发的增强版任务管理器软件工具,功能要比Windows系统自带的任务管理器的功能多很多。使用该工具可以查看服务、进程、线程、模块、句柄、磁盘使用状态、网络使用状态等多类信息。Process Explorer和下面要讲到的Process Monitor都是Winternals公司开发的免费工具,被放置在Sysinternals Suite工具包中。
Sysinternals Suite包含了一系列免费的系统工具,其中有大名鼎鼎的Process Explorer、Process Monitor、FileMon、RegMon等,如果把系统管理员比喻成战士的话,那么Sysinternals Suite就是战士手中的良兵利器。熟悉和掌握这些工具,并且对Windows的体系有一定的了解,将大幅度的提高日常的诊断和排错能力。
可以使用Process Explorer查看程序加载了哪些库(可以看到库的详细信息与路径),查看动态加载的库有没有加载起来(如果加载的库列表中没有找到,就没启动起来)。这类问题的实战排查案例,可以查看我的文章:
【C++动态库】动态库隐式与显式加载 | 为什么要动态加载动态库 | LoadLibrary加载失败 | 参考开源操作系统ReactOS源码 | 用LoadLibraryEx替代LoadLibraryhttps://blog.csdn.net/chenlycly/article/details/143201106使用Dependency Walker和Process Explorer排查瑞芯微工具软件RKPQTool.exe启动报错的问题
https://blog.csdn.net/chenlycly/article/details/140731614 还可以使用Process Explorer排查程序高CPU占用问题。可以查看程序的所有线程信息,找出占用CPU高的那个线程,双击查看线程的函数调用堆栈,根据堆栈中调用的函数定位CPU占用高的问题。我们在项目中多次使用该工具定位高CPU占用问题,相关实战分析案例,可以查看我之前写的文章:
使用Process Explorer/Process Hacker和Windbg高效排查C++程序高CPU占用问题https://blog.csdn.net/chenlycly/article/details/140731953
6、进程活动监测工具 Process Monitor
Process Monitor一款系统进程监视工具(Procmon.exe),主要用来监测目标进程的注册表和文件操作等活动。该工具也是微软Sysinternals Suite工具包中的一个工具,程序名缩写为procmon.exe,可以到微软的https://live.sysinternals.com/ 页面去下载(上面已经讲过)。
可以使用该工具监测目标程序执行某个操作时都读写了哪些注册表,相关的实战分析案例,可以查看我的文章:
使用Process Monitor探测Windows系统高DPI缩放设置的注册表项https://blog.csdn.net/chenlycly/article/details/130586460 还可以使用该工具监测目标程序的文件操作活动,相关的实战分析案例,可以查看我的文章:
使用Process Monitor工具探测日志文件是程序哪个模块生成的https://blog.csdn.net/chenlycly/article/details/133339034
7、API函数调用监测工具 API Monitor
API Monitor是rohitab出品的一个用来探测进程对API函数调用的工具(不仅可以探测对Windows系统API的调用,还能探测对第三方库的API调用),使用该工具可以窥探软件在实现一些功能时都调用了哪些Windows系统API函数,通过这些探测出来的API函数去估计出目标软件某些功能的实现方法。不仅可以探测出调用了哪些API函数,还能探测出调用API函数时都传递了什么样的参数,然后可以参照这些API函数及参数去实现类似的功能或者去尝试解决在开发软件过程中遇到的一些问题。
使用API Monitor排查问题的实战分析案例,可以查看我之前写的文章:
使用API Monitor探测QQ安装包在创建桌面快捷方式时都调用了哪些API及COM接口,以解决C++程序安装包中的问题https://blog.csdn.net/chenlycly/article/details/140177266使用API Monitor工具巧妙探测C++程序中监听某端口的模块
https://blog.csdn.net/chenlycly/article/details/133339829
8、调试器 Windbg
Windbg是微软提供的Windows平台下强大的用户态和内核态调试利器,给我们分析Windows上软件的异常提供了极大的便利和有力的支持,比原始的直接查看代码去分析异常的效率要高的多。Windbg在某些方面甚至要比微软的Visual Studio还要强大。作为C++开发人员,必须要掌握常用的调试技巧,必须要能分析和排查软件运行过程中遇到的各种异常,必须要熟悉Windbg或GDB调试器的使用。
Windbg分析软件异常主要有两种方式,一种是Windbg静态分析dump文件,一种是Windbg动态调试目标进程,要根据问题场景选择合适的方式。
8.1、Windbg 静态分析dump文件
使用Windbg静态分析dump文件,是排查C++软件异常最常用的方法。一般会在软件中安装异常捕获模块,当软件发生异常时,异常捕获模块能感知到异常并自动生成包含异常上下文的dump文件。此外,在个别场景下,我们可以选择从任务管理器中导出dump文件、从正在调试的Windbg中导出dump文件或者找寻系统自动生成的dump文件。程序发生异常时,有生成dump文件,事后将dump文件取来进行分析即可。
静态分析dump文件,主要查看发生异常的那条汇编指令以及异常发生时的函数调用堆栈,将堆栈与C++源码对照起来分析,必要时可以查看堆栈中函数中的相关变量值,某些变量值可能是关键线索。
关于使用Windbg静态分析dump文件的方法及一般步骤,之前我写过多篇文章,此处就不再赘述了,可以查看我之前写的文章:
使用Windbg分析dump文件定位软件异常的方法与操作步骤https://blog.csdn.net/chenlycly/article/details/146005441使用Windbg分析dump文件排查C++软件异常的一般步骤与要点分享
https://blog.csdn.net/chenlycly/article/details/142970834 关于通过在Windbg查看相关变量的值去快速定位问题的项目实战案例,可以查看我的文章:
通过查看Windbg中变量值去定位C++软件异常问题https://blog.csdn.net/chenlycly/article/details/125731044通过查看Windbg中变量的值,快速定位因内存不足引发bad alloc异常(C++ EH exception - code e06d7363)导致程序崩溃的问题
https://blog.csdn.net/chenlycly/article/details/146077409
8.2、Windbg 动态调试目标进程
软件中安装的异常捕获模块并不能捕获所有的软件异常,有个别场景下的异常捕获不到,也就没有生成dump文件。在没有dump文件的情况下,则需要考虑将Windbg附加到目标进程上进行动态调试了。将Windbg附加到目标进程上,如果异常复现了,Windbg会立即感知到并中断下来(操作系统会将异常投递给正在调试的调试器Windbg),此时就可以用kn命令直接查看当前的函数调用堆栈进行分析了。如果一时不会分析不出来,且当前问题出在其他人的电脑上,不能长时间占用别人的电脑(别人要用电脑做他们该做的事情),可以使用.dump命令导出dump文件:
.dump /ma D:\0501.dmp
然后将dump文件取回去分析。
如果异常问题很难复现,只能让测试人员每次启动程序时都把Windbg附加上去,直到复现问题为止。我们在项目中多次遇到这个情形了。
附加到进程上进行调试有两种方式,一种是将Windbg直接附加到已经启动起来的进程上,一种是直接用Windbg打开exe主程序去启动程序。后者的好处是,可以调试程序的启动过程,有时问题可能出在启动的过程中。
附加到进程上调试,不仅仅是为了复现问题时让Windbg去捕获异常,还可以进行一些动态调试,比如设置断点调试,设置数据断点调试。数据断点调试对于排查内存越界非常有用!举个动态调试的实例,比如有人咋用我们的软件勾选了自动保存密码,然后使用自动保存的密码进行登录,是可以成功登录的,但可能忘记密码具体是什么了。此时可以在Login接口入口处打个断点(假设调用该login接口时传入的密码是明文的),且当前有pdb文件,当调试命中断点时就可以查看传给Login接口的参数变量的值了,就能找回忘记的密码了。
关于使用Windbg动态调试目标进程的方法及一般步骤,之前我写过多篇文章,此处就不再赘述了,可以查看我之前写的文章:
使用Windbg调试目标进程排查C++软件异常的一般步骤与要点分享https://blog.csdn.net/chenlycly/article/details/145826705 此外,关于何时使用Windbg静态分析dump文件、何时使用Windbg进行动态调试,可以查看我的文章:
何时使用Windbg静态分析?何时使用Windbg动态调试?https://blog.csdn.net/chenlycly/article/details/131806819
8.3、Windbg 并不难学
有朋友反馈Windbg很难学,很难熟练地使用Windbg排查问题。其实Windbg的门槛并不高,只要掌握一些常用的Windbg命令以及分析dump文件的一般步骤,就基本可以入门了,但实战分析能力与经验是需要通过持续的实践不断地积累的。
一定要坚持把Windbg用到自己的工作实践中去,要主动的使用Windbg去分析排查问题,用的多了,就能逐渐地掌握Windbg的使用技巧和细节(确实有很多使用Windbg分析问题的技巧和细节的)!孰能生巧,熟悉了后就可以巧妙地去解决一些问题了!
在培训和交流的过程中发现很多C++程序员在软件调试这一块比较欠缺,无论是刚毕业的年轻人,还是工作多年的老程序员。这其中有一些环境的原因,也有一些个人的原因:
1)环境原因:
可能工作环境中同事们很少使用专用的调试器与分析工具去排查问题,无法接触到系统的软件调试技术。
2)个人原因:
还有一种可能,工作环境中有些同事已经在系统地使用调试技术去解决问题,并在公司、部门或者小组中做过详细的技术分享(培训),大家也有去听课学习,但大部分人都是三分钟热度,部分人可能没有认真学,部分人可能最开始觉得很有价值,学习态度比较好,但没有坚持下去,没有主动将所学的内容用到工作实践中去,然后就不了了之了,然后就没有然后了!学习技术,就是要投入大量的时间和精力,要不断的捣鼓和实践,要坚持不懈,把技术用到工作实践中去,才能获取进一步的理解和认知!这样才能真正掌握这些方法和技能。
一门技术或技能的学习,是需要不断地实践的!在学习之后,一定要努力将所学的东西运用到自己的项目与工作中去,一定要多捣鼓多实践,实践了才有价值,实践了才会有更进一步的理解和认知。在学习中持续实践,在实践中持续学习!
通过排查问题,去见识更多的问题场景,积累更多的排查经验。也可以将问题相关的文件(dump文件、pdb文件、问题代码截图等)保存下来,方便后面去查看,也可以为后面的技术分享积累案例和素材。
关于使用Windbg分析项目实战问题的实战分析案例,可以查看我的C++软件调试与异常排查的专题专栏,专栏中包含了大量的实战分析案例,详细讲解问题的完整分析过程,有很强的实战参考价值,专栏链接如下:
C++软件调试与异常排查从入门到精通系列教程https://blog.csdn.net/chenlycly/category_11397492.html 上述专栏中有一篇C++软件调试与异常排查学习路线分享的文章,感兴趣的话,也可以去看一下:
C++软件调试与异常排查技术从入门到精通学习路线分享https://blog.csdn.net/chenlycly/article/details/135048954
9、反汇编工具 IDA Pro
IDA是比利时Hex-Rays公司出品的一款交互式静态反汇编工具。它可以直接反汇编出二进制文件的汇编代码,是目前软件逆向与安全分析领域最好用、最强大的一个静态反汇编软件,已成为众多软件安全分析人员不可缺少的利器!它支持Windows、Linux等多个平台,支持Intel X84、X64、ARM、MIPS等数十种CPU指令集。
IDA既支持打开Windows平台的.dll库文件,也支持打开Linux平台的.so库文件。
Windbg在分析静态dump文件时,如果设置了源代码的路径,则输入.ecxr命令会自动跳转到产生异常的源代码的那一行上。但有时仅仅定位到代码的行号,可能因为此行代码涉及的对象和接口较多,无法确定具体是何种原因导致的异常。这时可以尝试使用IDA反汇编工具来查看汇编代码的上下文来辅助定位问题。很多时候,汇编指令才能最直观地反映出问题的所在。
使用IDA查看二进制文件的汇编代码上下文,是需要有一定的汇编基础的,关于为什么学些汇编以及如何学习汇编,我之前做过详细的总结,可以查看我的文章:
C/C++程序员为什么要了解汇编?了解汇编有哪些好处?如何学习汇编?https://blog.csdn.net/chenlycly/article/details/142795872 关于如何使用IDA查看汇编代码上下文去辅助定位软件异常问题,可以查看我的文章:
使用反汇编工具IDA查看发生异常的汇编代码的上下文去辅助分析C++软件异常https://blog.csdn.net/chenlycly/article/details/132158574 关于使用IDA查看汇编代码快速定位问题的实战项目案例,可以查看我的文章:
二进制机器码,汇编代码等价于二进制机器码,汇编代码是二进制机器码的助记符,汇编代码的可读性很强。在CPU中执行的是二进制机器码,等同于执行的就是汇编代码,通过查看汇编代码可以看出程序的具体执行细节。
C/C++程序员很有必要去了解汇编,了解汇编不仅可以很好地搞清楚高级语言代码难以理解的代码执行细节,还可以去辅助排查C/C++程序在运行过程中遇到的多种异常崩溃问题。
10、最后
作为C++软件开发人员,是很有必要了解并熟练使用上述这些高效的工具。其实,不仅仅是开发人员,这些工具对测试人员也很有用。
关于上述常用分析工具的更多实战分析案例,可以查看我的《分析C++软件问题的实用软件与高效工具实战案例集锦》的专题专栏,专栏中包含了大量的实战分析案例,详细讲解问题的完整分析过程,有很强的实战参考价值,专栏链接如下:
分析C++软件问题的实用软件与高效工具实战案例集锦https://blog.csdn.net/chenlycly/category_12279968.html专栏介绍:常用C++软件问题分析工具有SPY++、Dependency Walker、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决项目中遇到的多种问题,很有实战参考价值!
本文结合实际应用场景,对这些工具作了详细的介绍,希望能给相关开发人员及测试人员提供一些借鉴或参考。希望大家在今后的开发工作中能将这些工具用起来,去有效地提升软件开发、调试和测试的效率。