调试菜谱之一——调试家伙什

这里写的是能让你的调试效率倍增的工具,如果你觉得哪里还应该详细点,请跟帖。

 

1.VC2005(VC6)的Watch窗口

1.1 进入调试状态后,菜单-> Tools -> Window -> Watch ( Alt + 3 )

1.2 VC2005的watch可以看内置类型、Unicode字符串。

1.3 想看返回值的话,用eax。偶原来不了解这点,想看返回值时,另加代码,很麻烦。

1.4 查看err,相当于GetLastError()。其后加上,hr,即err,hr,可以直接从error code翻译到描述。偶原来也不了解这点,总是另加代码另加用Error Lookup,很麻烦。

好了,关于Watch窗口没什么说的了

 

2. VC2005(VC6)的Threads窗口

2.1 进入调试状态后,遇到断点、或主动暂停(按Ctrl+Break、或Debug->Break All),菜单-> Tools -> Window -> Threads

2.2 Threads窗口可以看到当前的各个线程运行情况。第一个是主线程,双击某个线程即切换CPU到该线程。

当CPU高时,可以暂停,查看当前运行到了什么地方。重复2~4次,如果每次都停到同一个地方,基本可以确定是这里出现问题,通常是死循环了。

 

3.VC2005的调试符号

3.1 N多人遇到过这样的堆栈

然后束手无策。其实只要设置好调试符号,即便是ntdll,也能看到它正在运行的函数。

3.2 菜单-> Tools-> Options-> Debugging -> Symbol

设置成这样

第一行http://msdl.microsoft.com/download/symbols,这是微软公开的pdb服务器。不了解pdb的伙计请google。

第二行http://symbols.mozilla.org/firefox,这是firefox的pdb服务器,有了它调试firefox就方便咯。

原理是这样的,VS从服务器那里下载pdb到本地,需要时加载它。我们自己写的debug程序之所以不必设置就能查看调用栈,即因为VS知道我们的pdb在哪里。

注意:一定要勾选,Search the above locations only when symbols are loaded manually。不然启动调试时你会骂娘,因为所有的pdb都是现下载的(如果以前没有,或发生变动,变动是常事,windows更新经常要改变ntdll等核心模块)。不勾选即要在启动时下载全部pdb,我机器上现在是425MB的,全部下载下来的话太慢了。

3.3设置好了,现在调用栈没有变化。右击调用栈,选择Load Symbols,然后等待,因为下载开始了。可以去你设定的本地pdb目录看看下载进度。我这里设的是E:/WindowsXP_PDB。等下完之后,调用栈会是这样滴:

注意:Load Symbols以模块为单位。

 

3.4 对于pdb,有些伙计有误解,认为不加载系统ntdll没关系,只要看到我自己的函数就行了。其实不然,VS显示的调用栈是根据一些信息,从上到下推导出来的。VS默认各个函数没有FPO(不了解的FPO的伙计请google)。但某些模块是有的,这样推导出来的堆栈会错乱。

注意红框部分,VS给了提示。

3.5 个人认为,设置好pdb服务器那是相当划算。

 

4. VS2005的Modules窗口

4.1 两个作用之一,看当前加载的模块具体地址。有时候不能调试,原因之一是当前用的模块不是刚编译出来的东西。可以在这里确认是否这个原因。

4.2 另一个作用,看模块的调试信息是否加载。

 

 

5. Process Explorer

5.1 System Internal套装里的好东西,不必安装即可使用,才3.34M,炒菜炒股的随身利器。我常用它:

5.2 看某进程中包含哪些模块。打开之后,选择一个进程,按Ctrl+D。

5.3 某exe,dll的具体地址。右击看属性。

5.4 找找是谁占用了某个模块(通常是dll)。按Ctrl + F,输入dll名。这个功能很有用,而且据我所知,目前没有别的工具有此功能(Unlock也可以,但不准确)。VS2005有个坏毛病,开发ActiveX时它经常占着那个不那个,编译时老提示不能打开,其实是它自己占用着,得关了重新来。

5.5 双击进程,打开更详细的信息对话框。请伙计们自行发掘。

 

6. TaskInfo

6.1 挺好的东西。可以看各线程的CPU占用、CPU统计,一个进程的句柄(文件、事件、SOCKET等),GDI对象。程序花屏多是因为GDI对象太多了,TaskInfo可以确认是否这个原因。

你可能感兴趣的:(调试菜谱之一——调试家伙什)