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>