windows调试器之Visual C++

visual c++ 是visual studio中的一个组件。windows下开发C++是一个首选工具。这个工具强大了,每个人都知道哈哈


我打算给大家介绍一些windows下常用的调试器:

visual c++

ollydbg

windbg

visual c++作为我们的开发工具,当做调试器当然也不逊色,那他与别的调试器相比有哪些优劣点呢?


visual c++调试器作为visualc++的一个组件,带源码调试是非常强大的。能显示出全局符号名、局部变量名和结构体等内容。

但是如果你没有源码或pdb符号文件,那用visual c++调试就是一个痛苦的过程了,由于它的汇编显示器没有对汇编指令加量显示,要想看清楚一个函数的逻辑,很不容易!


所以,visual c++ 是一个源码级调试器,如果你没有这个程序的源码,那建议你使用ollydbg。

visual c++ 调试器到底怎么使用呢?他有哪些功能?

  • 1. vc 调试器支持本地和远程调试
  • 2. vc 是一个应用层调试器,不支持对驱动调试
  • 3. vc对符号文件支持很强大,如果有对应的符号,就能显示出其中的局部变量和数据结构等
  • 4. 一次可以调试多个进程
  • 5. 可以对单个线程调试(把其他线程挂起)
  • 6. 可以查看所有线程调用栈
  • 7. 代码和汇编指令之间可以相互切换,很方便
  • 8. 灵活的断点设置


一、开始调试

1. 启动调试

vc调试器调试一个程序有两种方式:启动调试;附加调试

启动调试是最常用的一种,程序编译完成直接按F5启动调试


2. 附加调试

那附加调试怎么启动呢? “工具”-->"附加到进程"(或直接按Ctrl+Art+p)在弹出的对话框中选择要调试的进程,点击“附加”即可。


二、设置符号(pdb文件)

如果无法在代码中下断点,有一下几种可能:

1. 代码与编译时不一致

2. 没有符号文件

3. 符号文件不匹配

第一种情况,如果强制下断点,可能断点下错位置,从而无法在预订的位置断下来。最好找到当时对应的源码文件,或者转到汇编视图,在汇编中下断点。

第二种情况和第三种情况,需要正确的符号文件和路径

如果没有符号文件,那建议用ollydbg调试

如果有符号文件,并且知道位置,则可以按照下面步骤,

1. 设置符号目录:“工具”-->“选项” -->“调试”--> “符号”,增加一个符号路径。然后点击"加载所有符号",符号就会自动加载。

2. 如果不想设置符号目录,则,找到模块视图,选中模块点击鼠标右键,“加载符号”-->“符号路径”来手动选择正确的符号文件


三、断点

vc支持的断点很丰富

1. 普通断点:直接在代码中按F9。取消断点,再按F9

有时候普通断点无法满足调试需求,那看看他支持哪些断点类型

2. 根据命中次数下断

   如果只希望命中N次时才中断,则可以在断点上点击鼠标右键选择“命中次数”设置

3. 当产生中断时打印数据

如果希望命中时打印一些日志,则可以在断点上点击鼠标右键选择“命中条件”设置

4. 条件断点

条件断点是常用的断点,如当某个局部变量的值等于多少时才中断。可以在断点上点击鼠标右键选择“条件”设置

i == 5 && wsinfo.bNew == true (可以对一个结构的字段设置条件)

字符串条件断点:stricmp( proc32.szExeFile, "system") == 0 (如果进程名是system则中断)

vc还支持strcmp \strncmp等其他字符串比较函数

5. 条件筛选

如果你只想对某一个线程下断,可以使用条件筛选器。在断点上点击鼠标右键选择“筛选器”设置


四、调试相关的窗口

这些窗口都可以在"调试"-->“窗口”中的子菜单中找到

1. 模块列表

显示了所有模块信息。包括模块加载地址和大小、模块路径、是否加载了符号。

2. 线程列表

线程列表中可以查看每个线程的调用栈,并且可以挂起(冻结)个别线程

3. 监视器

监视器可以监视某个全局变量或者局部变量的值,当然寄存器的值也可以监视。

如果想看当前线程的LastError错误码,在监视器中输入 @err

4. 汇编器

可以看到源码对应的汇编指令

5. 内存查看器

可以根据一个地址,查看内存数据

6. 输出窗口

查看日志输出

7.调用堆栈

当前线程的调用栈

8. 自动窗口和局部变量

显示当前局部变量或全局变量的值,很方便

9. 断点列表

所有断点信息

10. 寄存器窗口

所有寄存器当前值


五、远程调试

如果想调试一个远程电脑上的程序该怎么办呢?

1. 在远程机器上运行远程调试监视器(vcmsmon.exe)

远程调试监视器所在目录:C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger

(我的VC安装在c盘,并且路径是默认的。vc版本是2010。可能与你的不同)

然后选择版本,如果目标机器是x86,则吧x86目录中所有文件COPY到目标机,如果是ia64,则COPYia64目录到目标机中

然后在目标机上启动vcmsmon.exe进程。并设置成TCP链接方式,端口为默认。"工具"-->“选项”中设置

2. 远程启动调试

“项目”-->"属性"“配置属性”“调试”

在“要启动的调试器”中选择“远程 windows 调试器”

命令”中输入远程机器等待调试的进程全路径

工作目录”设置进程的工作目录

"远程服务器名字" 输入 远程机器IP

链接”中选择“不带身份验证的远程访问”

设置好后,按F5启动调试

3. 远程附加调试

“工具”-->"附加到进程"(或直接按Ctrl+Art+p)在弹出的对话框中的

传输”中选择“远程(...)

"限定符"中输入远程机器IP

然后点“刷新”

选择要调试的进程,点击“附加”


六、其他

1. 调试快捷键:

F10单步步过

F11单步步入

F5继续

shift+f11 跳出


转载请注明出处。点点灵犀 sunyikuyu <ddlx studio>



 

posted @ 2013-04-21 21:49  javawebsoa  Views(918)  Comments(0Edit  收藏  举报