目录
1、概述
2、高效软件工具介绍
2.1、窗口查看工具SPY++
2.2、Dependency Walker
2.3、剪切板查看工具Clipbrd
2.4、GDI对象查看工具GDIView
2.5、Process Explorer
2.6、Prcoess Monitor
2.7、API Monitor
2.8、调试器Windbg
2.9、反汇编工具IDA
2.10、抓包工具Wireshark
3、总结
1、概述
通过公司内部培训交流以及 上技术沟通得知,很多C++软件开发人员都没有用过GDIView、Process Explorer、Process Monitor、API Monitor、Windbg、IDA等高效分析工具,甚至都没听说过,他们分析排查问题的方式还停留在用IDE调试和查看打印日志的老方法上,效率相对较低,所以很有必要给大家普及一下这些高效的分析工具,大家都值得拥有!希望大家在今后的开发工作中能将这些工具用起来,去有效地提升软件开发调试的效率。
有人可能会问,你怎么了解到这么多工具的实这些技能都是通过项目实践不断积累得来的,有的是大家都用的,有的是同事或朋友推荐的,有的是 上搜索问题时别人建议的。我已经熟练掌握这些工具的使用,已经将这些工具全面地应用到商业项目的问题分析中,解决了开发调试中遇到的多个问题,极大地提升了分析问题和解决问题的效率。
2、高效软件工具介绍
2.1、窗口查看工具SPY++
SPY++是微软IDE软件Visual Studio自带的一个小工具(spyxx.exe),该工具可以查看当前系统中打开的所有窗口的信息(包含显示和掩藏的窗口),在做UI界面编程分析窗口问题时该工具比较有用。
SPY++的主界面如下所示:
使用该工具,我们可以来查看目标窗口的位置、大小、窗口样式、父窗口等信息,如下所示:
对于可见的窗口,可以直接将探测按钮拖动到目标窗口上:
直接查看目标窗口的信息。
对于掩藏的、不可见的窗口,也可以直接在SPY++主窗口中的窗口列表中以窗口标题、类名、窗口句柄等关键字去搜索目标窗口,搜索到后查看窗口属性即可。
在模仿其他软件实现一些特效窗口时,通过这个工具查看特效窗口的一些属性,然后去参考相关属性的设置。我们也可以将SPY++列表中所有的窗口(当前系统中创建的所有窗口)信息保存到文件中,操作入口如下所示:
这在分析窗口异常崩溃的问题会很有用。
2.2、Dependency Walker
Depenency Walker是微软提供的一个库依赖查看工具(depends.exe),该工具可以查看二进制文件exe和dll动态库的导出接口信息,也可以查看二进制文件的库依赖关系。这个工具虽然很小,却很实用,是分析软件因为库依赖问题导致的启动 错的最直接工具。该工具是早期Visual Studio自带的工具,现在的Visual Studio不再打包该工具了,可以到Depenency Walker官 上去下载。
Dependency Walker的主界面如下所示:
2.2.1、排查启动 找不到dll库的问题
一个exe程序的启动过程大概是这样的:
用户启动exe程序时,系统会分配对应的进程空间,首先去读取exe文件中的PE头信息,读出exe主程序依赖的所有dll库信息,然后系统将这些依赖的dll库加载到当前进程空间中(加载到进程空间的dll库包括exe开发者开发的dll库,也包括依赖的一些操作系统的dll库),待依赖的库完成加载之后,再去加载exe文件,然后进入exe文件中的main函数,这样exe程序就启动起来了。
如果加载依赖库时找不到依赖库文件,或者找到的依赖库的版本不对,会直接弹窗 错,提示程序启动失败。Depenency Walker工具正是用于排查这类问题的,比如程序启动时缺少库 错、在某个dll库中找不到某个接口 错等。
以以前遇到的一个问题为例,程序启动时 如下的错误:
提示找不到MSVCP100D.dll运行时库(D对应debdebug版本的运行时库),程序是release版本的,怎么会依赖debug版本的运行时库呢计是底层依赖的dll库(底层的库包括底层的业务库、 络库、协议库、组件库、音视频编解码库等)发布的有问题,错误地把debug版本的库发布到我们release版本的exe产品流中了。
于是用Dependency Walker打开exe程序,查看其依赖的库,看看哪个库依赖了的debug版本的MSVCP100D.dll,可以查到:
是截图中的dll库依赖了debug版本的MSVCP100D.dll,找到该问题库的维护组,让他们重新发布release版本的库即可。
2.2.2、排查动态启动的dll库启动失败的问题
有的库可能是主程序动态启动的,如果这些动态启动的库因为其依赖的库有问题导致库动态加载失败,是不会弹出上面那种明确的提示框的。比如a.dll库是动态启动的,如果该库启动失败,会导致与之相关业务无法进行,此时可以先使用Process Explorer查看主程序的库加载情况(Process Explorer工具下面也会介绍,该工具会将目标进程加载的所有的dll库显示出来),确定a.dll有没有启动起来:
注意打开Process Explorer后,要点击上方工具栏中的View DLLs图标按钮才能查看目标进程加载的dll列表,然后在该列表中查看目标库有没有启动起来。
假设a.dll没有启动起来,有可能其依赖的库找不到,也可能该库中调用的接口在其依赖的库中找不到。我们再用Dependency Walker直接打开a.dll查看其库依赖的情况即可找到原因。如果库有问题,在其前面会显示红色或黄色警告图标:
黄色图标表示系统中找不到该库,红色图标表示某接口在某个库中找不到。
这里需要注意一下,Dependency Walker打开目标文件后,默认会展开目标文件依赖的所有的库,其中包括很多Windows系统库,我们要通过经验加以甄别,将Windows系统库都折叠起来跳过去(要熟悉一些常见的Windows系统库,比如ntdll.dll、user32.dll、kernel32.dll等。),一般问题都出在我们应用程序的业务库中的。
此外,还有一些api-ms开头的库,在Dependency Walker中显示黄色图标,一般是没问题的。这些api-ms开头的库,一般是应用程序开发者需要打包到产品的安装包中的,这些库在安装时会自动释放到程序的安装路径中的,以腾讯会议的安装目录为例可以看到这些库:
最后有一点需要说明一下,Dependency Walker在win10系统中打开文件时特别慢,有可能是Dependency Walker版本比较老(好几年前出的版本),对win10系统的兼容性不好导致的,打开文件时可能要等上好几分钟才能打开。在这种时候,需要耐心等待一会。
2.3、剪切板查看工具Clipbrd
该工具主要用来查看剪切板中包含了哪些剪切板格式的数据,在处理数据的复制与粘贴时很有用!在XP系统中,该工具是系统自带的,但自win7系统开始就不再带该工具了,需要的话可以到XP系统中拷贝出来,也可以到 上去下载。
有人可能会说,这都什么年代了,谁还用XP系统啊!确实,现在确实很难找到还使用XP系统的电脑了。不过我们在2009年刚毕业那些年,一直用的还是XP系统。然后出现了Win7系统,并逐步普及,到最近几年已经完全普及了Win10系统,新版本的Win11都出来了。几年前,微软甚至还说Win10将是Windows系统的终极版本,结果微软还是食言了,近年又搞出了Win11。
我几年前参与了一款IM即时通讯软件的开发,要实现聊天窗口中聊天内容的复制和粘贴功能,要支持多种剪切板的格式,要支持与其他常用IM软件比如QQ、PC版微信、企业微信等间的复制粘贴互通,即在IM软件的聊天框中对图片与文字的混合内容进行复制,然后将内容粘贴到QQ等的聊天输入框中,QQ的输入框中可以正常显示;从QQ中复制图片和文字的混合内容,也要能够粘贴到我们的IM软件中并正确显示出来。
那如何知道QQ等软件都支持哪些剪切板格式呢用Clipbrd就可以看到。具体的做法是,我们先在QQ的聊天框中复制图片和文字的混合内容,然后打开Clipbrd剪切板查看工具,在Clipbrd的菜单栏中点击查看,在弹出的菜单中就可以看到QQ在复制图片和文字的混合内容时都生成了哪些剪切板格式的数据,如下图所示:
从图片中可以看出,QQ生成了多种剪切板格式的数据,其中QQ_Unicode_RichEdit_Format格式是QQ专有的剪切板数据格式, HTML Format格式则是通用的格式,是很多IM软件和邮箱都支持HTML Format格式。
系统支持的预定义剪切板格式有CF_TEXT(文字)、CF_UNICODETEXT(Unicode文字)、CF_BITMAP(位图图片)和CF_HDROP(可拖拽数据)等,这些基本格式可以直接使用。对于QQ_Unicode_RichEdit_Format、HTML Format等这些用户自定义格式,则需要使用API函数RegisterClipboardFormat向系统注册才能获得对应CF值,这样自定义的剪切板格式是以“QQ_Unicode_RichEdit_Format”、“HTML Format”字符串作为标识的。
如果我们要知道某种自定义剪切板格式对应的数据内容与格式,可以编写类似如下的测试代码,去获取指定剪切板格式的数据内容:
可以将指定格式的剪切板数据读出来,看看里面的数据格式是什么样子的。比如获取到的QQ_Unicode_RichEdit_Format剪切板格式的数据内容如下:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!