zoukankan      html  css  js  c++  java
  • 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>



  • 相关阅读:
    团队作业---软件制作8
    团队作业---软件制作7
    团队绩效考核表
    团队报告
    团队作业---软件制作6
    团队作业---软件制作5
    团队作业---软件制作4
    团队作业---软件制作3
    团队作业---软件制作2
    第十周学习进度条
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3034589.html
Copyright © 2011-2022 走看看