`
tansitongba
  • 浏览: 497322 次
文章分类
社区版块
存档分类
最新评论

Visual Studio调试之断点进阶篇

 
阅读更多

在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT Intel系列CPU的一个指令,可以让程序产生一个中断或者异常。程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler)。IDT是操作系统在启动的时候初始化的,至于IDT的细节问题,例如什么是IDT,怎样编写一个IDT的例程,怎样 初始化IDT,可以去网上搜索一些资料。

总之,这里我们只要知道,CPU在执行程序指令过程中,碰到INT 3中断程序的执行,CPU然后去IDT表里面找到处理断点的例程入口。这个例程要做的事情就是:

1. 先看看机器里面是不是安装了一个调试器记住,这一步很重要,之所以重要以后的文章里面会介绍。

2. 如果机器里面没有安装调试器,那么操作系统就会终止程序的执行。

3. 否则操作系统启动调试器,并将调试器附到进程上。

4. 这样,我们才能在调试器里面检查程序内部变量的值。

前面文章里面的INT 3 (或者DebugBreak(),或者Debugger.Break())指令是我们自己在代码里面硬编码进去的,因此我们在Visual Studio里,在相应的代码行里面点一下,出现一个小红球,也就是说Visual Studio在程序指令集某个地方动态地添加了一个INT 3指令。现在的问题来了,Visual Studio是如何在程序中正确找到插入INT 3指令的位置的?

或者更具体一些,我们在源代码(文本文件)里面设置断点的,Visual Studio需要把代码行翻译成在程序指令集中的位置。Visual Studio之所以需要做翻译,是因为通常一行C++或者 C#代码都会对应好几行汇编指令。

因此,Visual Studio需要一个额外的文件来执行这个翻译过程,这个额外的文件叫做调试符号文件(Symbols),是由编译器生成的。Visual Studio系列的编译器,不论是C#VB.NET还是C++编译器都会生成这个调试符号文件,.pdb 文件。所以如果你花一点时间看看Debug文件夹的话,你就会发现这个文件。

因此我们来看看Visual Studio支持的各种断点,并解释各种断点的实现方式

条件断点

首先我们先看看如何设置条件断点,条件断点有两种,一种是根据触发的次数来设置,另外一种是根据一条预置的条件来设置。

根据触发次数设置

比如说,你有一个循环,循环1000次,你知道有一个BUG总是在500次之后才会出现,因此肯定希望在循环内设置一个断点,但是前面500次都不会触发这个断点,否则连续按500次的F5的确不是一件轻松的差事。

根据预置条件来设置

如果你已经知道一些条件可能会引发Bug,那么根据条件来设置则最合适不过了。如下图所示:

在“断点条件(Breakpoint Condition)”对话框里面,只需要输入一条正常的C#C++或者VB.NET的语句就可以了(当然,语法是根据你项目里面的源代码语法一致),这条语句的要求是必须返回bool否则就不是一个条件了。

第三个还有断点过滤器,当你在断点上,右键点击弹出的菜单里面,会有一个“过滤(Filter)”菜单,它允许你限制将断点仅设置在特定的线程上。这里我就不细讲了,有兴趣的话,可以自己写一个多线程或者多进程程序试试这个功能。

知道断点的原理以后,理解条件断点应该就不会是问题了。

监视断点(Watching Point

有的时候,你可能需要查看程序内部一些变量的值,但是你又不希望中断程序的执行。例如你在调试一个网络协议栈,一个程序可能在接收数据包,你想看看数据包的格式,但如果中断程序的执行,会导致后续的数据包丢失。

因此,我们一般的做法就是在源代码里面加一些日志记录代码,这样可以将一些变量的值记录下来,以便后续分析。如果日志在产品发布以后还需要的话,在源代码里面加入这些日志代码固然是一个好主意,但是如果你只是想临时看看一些变量的值呢?

这个时候,监视断点就很有用了,Visual Studio的监视断点就可以让你做到在不修改程序源代码的前提下,在调试器窗口中打印一些变量的值。

下图演示了监视断点的用法:

设置监视断点的步骤,或者说是注意事项吧:

1. 设置一个普通的断点

2. 右键单击刚刚设置的断点,在弹出菜单里面选择“When Hit…

3. 钩选 第一个“打印一条消息(Print a message)”复选框,输入一串文本,默认情况下,你输入的文本会被直接打印到调试的输出窗口里面来。除了:

a. $符号开头的几个关键字。比如$FUNCTION就会被替换成断点所在的函数名。其他有一些关键字在“When Breakpoints Is Hit”窗口当中有详细的说明。

b. 使用 大括号 {}包含起来的变量名,这样的字符串会被替换成变量的值。

这下面就是监视断点的效果,注意,你只能在Visual Studio的“输出(Output)”窗口中查看结果。

监视断点相对于日志记录的好处是,你不需要改动源代码,并且重新编译代码。实际上Visual Studio实现监视断点的原理也很简单,就是插入一个普通的断点,断点触发之后处理并且打印在“When Breakpoints Is Hit”窗口输出的表达式,最后自动恢复程序的执行。

分享到:
评论

相关推荐

    visual_studio_c#_调试入门级介绍

    ### Visual Studio C# 调试入门及进阶技巧详解 #### 一、引言 在软件开发过程中,错误和异常处理是不可避免的部分。对于初学者来说,掌握有效的调试技术至关重要,这不仅能帮助他们更快地定位问题所在,还能提高...

    visualStudio.net学习资料

    本学习资料将深入探讨Visual Studio .NET的关键特性,帮助初学者及进阶者全面掌握这一工具。 一、Visual Studio .NET 的主要功能 1. 集成开发环境:提供了一个统一的界面,用于编写、调试、测试和部署软件。其丰富...

    Professional Visual Studio 2012.pdf

    根据所提供的文件信息,可以看出这是一本关于Visual Studio 2012的教材《Professional ...通过从基础到进阶的详细介绍,本书旨在帮助读者充分利用Visual Studio 2012的强大功能来完成各种类型的应用程序开发任务。

    visual studio 2010中的C++入门教程

    ### Visual Studio 2010中的C++入门教程知识点概览 #### 一、基础知识概述 - **Visual Studio 2010简介**: - Visual Studio 2010是一款由微软公司开发的集成开发环境(Integrated Development Environment, IDE)...

    Visual Studio 2005入门.net

    Visual Studio 2005提供了强大的调试工具,包括断点、步进执行、变量监视等,帮助开发者查找并修复程序错误。此外,学习如何编写单元测试,使用测试驱动开发(TDD)的方法,可以提高代码质量并确保软件功能的正确性...

    vs2008程序调试入门与进阶

    标题和描述概述的知识点主要集中在使用Visual Studio 2008进行程序调试的基本技巧和进阶策略,这对于初学者尤其重要,因为理解并熟练掌握这些技术可以显著提高开发效率,减少错误,提升软件质量。以下是对这些知识点...

    VS2008程序调试入门与进阶.doc

    Visual Studio 2008(VS2008)是一款强大的开发环境,对于程序员来说,掌握其调试技巧是至关重要的。以下将详细介绍如何在VS2008中进行程序调试。 首先,让我们了解基本的调试快捷键: 1. **F9**:设置或取消断点...

    MICROSOFT-VISUAL-STUDIO入门经典教程

    - **调试技巧深入**:详细介绍如何利用 Visual Studio 的调试工具,包括查看调用堆栈、条件断点等高级功能。 - **性能优化**:讲解如何利用 Visual Studio 的性能分析工具进行代码优化,提高程序运行效率。 - **跨...

    《Microsoft_Visual_Studio_C++_2010入门经典》完整版

    3. **调试技巧**:掌握使用Visual Studio 2010中的调试工具进行程序调试的方法,如设置断点、查看变量值、单步执行等。 4. **代码优化**:了解如何使用Visual Studio 2010提供的性能分析工具对程序进行优化,提高...

    付工上位机实战Visual Studio 零基础入门

    5.1 调试技巧:利用Visual Studio的断点、单步执行、监视窗口等功能,查找并修复代码中的错误。 5.2 性能优化:了解内存管理、CPU占用、响应时间等因素,对代码进行性能调优。 六、项目部署与发布 6.1 配置管理:...

    Microsoft_Visual_Studio_C++_2010入门教程(修订版)

    - **调试技巧**: Visual Studio 2010 提供了强大的调试功能,例如断点设置、变量查看、调用堆栈分析等,这些都是提高代码质量和开发效率的重要手段。 **2.2 新特性与更新** - **STL 改进**: Visual C++ 2010 对...

    ASP.net网页设计范例100百例通源代码程序VisualStudio2008创建

    8. **错误处理和调试**: 实例可能涵盖了如何处理运行时错误,设置断点,以及使用Visual Studio的调试工具。 9. **部署和发布**: 最后,学习如何将ASP.NET应用程序打包并部署到IIS服务器上是至关重要的。这些实例...

    Visual C++ 6 轻松进阶

    《Visual C++ 6 轻松进阶》是一本专为初学者设计的教程,旨在帮助读者快速掌握Microsoft的Visual C++ 6编程环境。Visual C++ 6是90年代末至21世纪初广泛应用的一个开发工具,它集成了编译器、调试器、资源编辑器等,...

    Visual Studio 2010编程教程

    39. **使用调试窗口**:介绍了Visual Studio中的调试工具。 40. **使用断点进行调试**:教授了如何使用断点进行调试。 41. **数据提示、调试代理和可视化器**:介绍了调试过程中的一些高级工具。 42. **调试 Web ...

    VisualStudio.ne C#初学者必看,完全手册Visual C#开发技术详解中重要的章节

    它是Visual Studio IDE中的主要编程语言之一,尤其在开发Windows应用程序、Web应用程序和移动应用程序时非常常见。对于初学者来说,理解和掌握C#的基本语法和特性是至关重要的。 1. **变量与数据类型**:C#有多种...

    VisualStudio2005C开发技术的PDF教程

    总的来说,这本《Visual Studio 2005 C++ 开发技术详解》教程涵盖了C++编程从入门到进阶的各个层面,结合Visual Studio 2005的强大功能,是初学者掌握C++开发的宝贵资源。通过系统学习和实践,读者将能够独立完成C++...

    Teach Yourself Visual Studio .NET 2003 in 21 Days

    8. **调试和测试**:掌握如何在Visual Studio中设置断点、跟踪代码、检查变量值以及进行性能分析,确保代码的正确性和效率。 9. **部署和发布**:学习不同类型的部署策略,包括ClickOnce和Web部署,以及如何配置IIS...

Global site tag (gtag.js) - Google Analytics