掌握C++Builder的除错艺术 第二篇(1)

原创 2001年02月08日 23:40:00

Mastering the Art of Debugging in C++Builder
Article 2 - Watching it Closely

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

掌握C++Builder的除错艺术

第二篇-近距离观察(1

 

 

1.      调试/除错可执行程序前的准备

2.      工程选项

3.      设置断点并闯入可执行程序

4.      察看储存在变量中的值

5.      使用Watches(守护察看)

6.      使用Inspectors

7.      使用Evaluate/Modify(求值/修改)

8.      Stepping Through, Over and Around Blocks of Code

9.      Stepping Types

10. Stepping Notes

11. 其他提示


Okay,(再小小准备一下)现在开始追踪、搜索经过前次的努力后仍然躲在代码中的bug的时候了,也就是开始跟踪前一篇文章代码里标记过的bug/异常。首先是准备阶段。

调试/除错可执行程序前的准备

在我们开始调试可执行程序前,我们需要确保一些设置在大多数情况下的正确性。我将会一条接一条的过一遍,并简单解释一下为什么必须那样做。(如果你对有些东西感兴趣的话,按下帮助按钮,会有许多更详尽的内容)。现在就开始吧,先打开Project|Options选项。

工程选项

首先我们在"Compiler"(编译)标签处停下。你只需简单单击"Full debug"(完全调试模式)按钮我们所需的绝大多数的其余设置就已经搞定了。将代码"Code optimization"(代码优化)设为"None"(无)总是件好事,这样做实际上十告诉编译器,所有的事情都做好了。你只需产生机器码就行了,而不要为了提高一点点运行速度尝试进行其他的智能优化。(当然,一切都完成之后,您可以打开此项。)这样做的好处是大大降低了我们调试的难度。因为,程序中的代码与我们书写的一样,没有被编译器优化过。在"debugging"(调试)面板中,将"Debug information"(调试信息)选上(点一下),并且必须设置为"Line number information"(行数信息)。我还建议将"Disable inline expansions"(禁用内联扩展)一项选上。内联扩展对发布的代码来说很好,但调试时最好还是关掉此项,他只会让你更头痛。

然后是"Pascal"标签,尤其在您的工程里连接了Pascal单元或使用了基于PascalVCL控件时(若你拥有其Pascal源码时,编译器会自动使用此节中的设置重新编译)。这里你必须将"Optimization"优化选项禁用,然后通常我会将"debugging"(调试)部分的所有选项选上(打钩)。

接下来是"Linker"(链接)标签,我们需要选上"Create debug information"(生成调试信息)。"Use dynamic RTL"(使用动态RTL)以及"Don’t generate state files"(不要生成状态文件)是造成麻烦的选项,我通常都会使用状态文件(这样允许增量链接,但会在编译目录下产生一个4倍于可执行程序或更大的文件),换个角度来说,这样会增加链接大工程时的速度。使用dynamic RTL本身就是个争论,有很多赞同和反对的讨论。

下一个是"Directories/Conditionals"(路径/条件)标签。在这里我们想要设定"Directories/Conditionals"(调试源路径)的值。我们永远都应将此处设定为$(BCB)/source/vcl,但是如果您有任何其他的组件附加的话,通常将它们的路径也加上是个好主意(路径与路径之间用”;”分隔或者您可以用按下按钮弹出的对话框来设定它们)。

最后也是最重要的设置是在"Packages"(程序包)标签上。根据所有恰如其分的调试经验你必须禁用"Build with runtime packages"(带运行时程序包编译)。这么做的原因是程序包本身不包含而且不能包含调试信息。这样做,也许不利于您跟踪标准的VCL代码,例如想看清楚VCL函数y中参数x是如何起作用的时候。但是大多数时候,您这么做将会发现调试器将您的绝大多数“症状”归结给VCL,尽管“病因”就在你的源代码中(或在其他的组件中(这已经在我们所有人身上发生了))。一旦您发布您的正式版本时,您可以决定是否使用程序包。(译者注:程序包的本质是一个特殊的DLL,不带运行程序包(静态)编译可以让你的程序脱离Cbuilder独立运行。),但在调试时,请禁用掉。按下OK按钮,我们已经准备好啦。下一个对话框只需打开一次,但最好还是来检查以下我们在这里的设定是否正确。好了,打开”Tools|Debugger Options…”吧。

对话框最下方的"Integrated debugging"(集成调试器)选项是关键所在。确信已经打上钩。按下OK按钮准备编译可执行程序吧。我建议重新来一次彻底的编译(选择Project|Build All),如果您修改过您的设置的话(尤其是改变”building with packages”方式后)。这将保证我们的所有程序单元按照我们所希望的那样被编译。

设置断点并闯入可执行程序

象您所见过的其他任何一款调试器一样,C++Builder提供强大的断点设置功能。基本上,断点是指代码中的一个点,程序执行至此停下(与退出不同,这只是执行中的暂停)并将控制权交还给调试器。设置一个断点相当容易。只需在你想要设置的程序代码行左侧的灰色槽形区域点击,您会看到一个红点出现,这一行也会变红。程序运行到这一点就会暂停,将控制权交还给调试器。

您也许会问如果我不想每次都停下来呢?当然可以,而且还很容易做到,这取决于您暂停程序的标准是什么?(译者注:条件断点)。在刚才那个断点(红点)上右击鼠标并从弹出菜单上选择” Breakpoint Properties”(断点属性)。此处可以设定两种属性"Condition"(条件)和"Pass Count"(通过次数)。Condition(条件)属性太方便了。你可以利用if()语句输入几乎是任意的条件。但请牢记条件中的所有变量,对此断点都应是可见的。条件属性并未被编译器编译到执行程序中,而是在运行时,当程序运行至断点暂停后,检查断点的条件是否满足。条件为真,停下,否则让程序继续运行。另一个属性"Pass Count"(通过次数)也很容易理解。断点将被通过Pass Count次后停下。结合使用这两个属性,在调试您的代码时,你可以设定非常严格的断点。

还有一件要牢记的是,当您在调试器中发生异常时,会以产生异常处的那一行代码上的断点的形式出现。这种情况很容易制造。一旦您得到一个异常后应做的步骤我会在以后展示如何在堆栈中回溯并跟踪找出异常发生的真正原因(如引起异常产生的那一小片代码)。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

另一个要牢记的提示是当你运行你的程序时,代码窗口左侧有蓝点的任意一行都可以设成断点。所有非法的断点将会变为红点中带一个黄色的小叉,这一行代码也会变成黄褐色。合法的断点则变为红点中带一个绿色的小钩。运行时,你可以设置/修改任意一点,断点立即生效而无须重新编译

察看储存在变量中的值

一旦你的程序在你的断点处停下后,该做什么?有一件事你想做而且必须做的,那就是察看储存在你程序中的各种变量真实的值。这部分内容涉及的方面很多,您一定要坚持,忍受这些枯燥的东西。幸运的是当你看完这些,你一定会对调试器这部分最强大的功能有些新的理解。有许多种方法可以察看变量的值,主要要根据您的目的来决定。我会从察看当前函数的Local Variables(局部变量)开始把他们都讲完。

察看局部变量没有太多可以讲的。只需点击”View|Debug Windows|Local Variables”,或按下ctrl-alt-L

掌握C++Builder的除错艺术-第二篇(完整版)之一

    Mastering the Art of Debugging in C++BuilderArticle 2 - Watching it Closely掌握C++Builder的除错艺术第二篇-...
  • cker
  • cker
  • 2001年02月11日 01:29
  • 1426

掌握C++Builder的除错艺术-第二篇(完整版)之二

 Mastering the Art of Debugging in C++BuilderArticle 2 - Watching it Closely掌握C++Builder的除错艺术第二篇-近距离...
  • cker
  • cker
  • 2001年02月11日 01:33
  • 1276

掌握C++Builder的除错艺术-第一篇

 Mastering the Art of Debugging in C++BuilderArticle 1 - Coding it Right掌握C++Builder的除错艺术第一篇-正确书写代码 ...
  • cker
  • cker
  • 2001年02月07日 07:06
  • 1483

ZT:掌握C++Builder的调试艺术

以代码为基础的调试方法  程序的bugs越少,最终用户对这个程序的评价越高。而开发人员事先对bugs的处理越多,最终用户能提供的关于bugs的信息就越多,也越准确,这样,开发人员在接到最终用户反映之后...
  • tingsking18
  • tingsking18
  • 2006年03月01日 13:58
  • 1392

[转载]掌握C++Builder的调试艺术

(作者:霍炬编译)  程序的bugs越少,最终用户对这个程序的评价越高。而开发人员事先对bugs的处理越多,最终用户能提供的关于bugs的信息就越多,也越准确,这样,开发人员在接到最终用户反映之后,就...
  • extcsdn
  • extcsdn
  • 2005年08月21日 22:03
  • 943

国嵌语言的艺术之C++项目讲解精讲班

1.C到C++的升级数据类型的加强  面向对象的支持  C与C++的关系  2.函数的升级函数默认参数  函数重载  内联函数  C函数与C++函数的交互  3.华丽的新宠引用的定义...
  • u013948187
  • u013948187
  • 2015年07月28日 07:33
  • 829

读《计算机程序设计艺术》卷1:基本算法(第3版)

共5卷,高德纳 第4卷写了三本,A,B,C 还计划写第6卷和第7卷 数学家,是什么样子的,看这本书去找答案。 习题说明 题1,M20:如果习题涉及的数学概念或者动机大大超...
  • wide288
  • wide288
  • 2017年12月18日 10:36
  • 171

代码审计的艺术系列—第二篇

0x01 前言 现在的WEB程序基本都有对SQL注入的全局过滤,运维人员配置PHP环境是一般会开启魔术引号GPC,即magic_quotes_gpc=On的情况下,如果输入的数据有单引号(’)、双引号...
  • qq_29277155
  • qq_29277155
  • 2016年07月24日 16:58
  • 518

尽快掌握C++BUILDER的使用

要尽快掌握C++BUILDER的使用 C++Builder开发工具是由Borland公司推出的一款高性能可视化集成开发工具,他不但集成大部分开发工具的有点,C++Builder开发工具还提供...
  • icjava
  • icjava
  • 2007年12月01日 19:57
  • 663

提问的艺术(中文版)

在**世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度, 同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案……不想掩饰对这样一些人的蔑视--他们不愿思...
  • danky
  • danky
  • 2006年11月07日 08:47
  • 28398
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:掌握C++Builder的除错艺术 第二篇(1)
举报原因:
原因补充:

(最多只允许输入30个字)