编程语言

img zhengyongchen

C++ Builder调试技术

发表于2004/10/19 12:15:00  6569人阅读

分类: C++ Builder

C++ Builder调试技术

 

在软件开发过程中,调试是一个重要的环节,调试技能也是开发人员所必须掌握的重要技能。现在的开发工具,如C++ Builder,通常都提供了强大的调试器。一个好的调试器,加上一个经验丰富的开发人员,就可以使软件很快从原始状态发展到具备发布质量的代码。调试器提供了一些工具来检查运行中软件的状态,而开发人员则应该具有洞察力来解释这些信息。以下是我在使用C++ Builder过程中关于调试技术的一些疑问及解答,欢迎大家补充与指正。

 

n         Q:在VC中,可以带编译参数DEBUGNDEBUG,这样带不同的参数就可以编译出DEBUG版和非DEBUG版,不知在C++ Builder中如何做到?

A:在C++ Builder中也可以做到,方法是点击菜单project|options…,打开工程属性:


 

Conditional defines中可以定义编译参数,以下代码,如果条件定义为NDEBUG,则输出结果为"The actual messages",如果以上条件定义为DEBUG,则输出结果为"The debugging messages"

    #ifdef DEBUG

    ShowMessage("The debugging messages");

    #else

    ShowMessage("The actual messages");

#endif

 

       注意,以上条件为编译参数,和工程的设置为Full debugRelease没有关系。也就是

说即使是设工程为Release版,若Conditional defines设为DEBUG,同样会输出调试信息。

 

 

n         Q:为什么需要带编译参数DEBUGNDEBUG来编译不同的版本。

A:除了使用软件调试器外,我们还可以在调试阶段插入一些语句来记录日志信息,接着把这些信息写入控制台、文件或其它输出设备中。这样做的好处是可以发现很多与时间有关的bug。从发布的产品中删除调试语句也非常重要,因为一些关于产品实现的敏感信息可能会通过调试消息泄漏出去。若被竞争对手掌握,这些信息可能衍生出大量信息。一种方法是在开发阶段在语句中插入若干ShowMessage语句,在产品发布后将这些语句逐个去掉。但手工将这些语句去掉,不仅费时,而且容易遗漏。产品发布以后如果发现有Bug,要恢复这些调试语句以跟踪问题,又该怎么办?解决的方法是带上编译参数DEBUGNDEBUG,根据自己的需要生成合适的版本,而不用修改代码。

 

 

n         Q:在多线程程序中,因为一段代码的执行次序是不定的,这时无法使用C++ Builder的断点跟踪,这时该采用何种调试方法?

A:需要指出的是,即使是多线程程序,也可以使用C++ Builder的断点跟踪技术,只是需要更多的耐心和技巧。因为不管多线程程序运行时序如何,但对于其中一个线程来说,一定是按照时序进行的,我们只要牢牢盯住这个线程所要执行的代码,排除其它代码执行的干扰,就能跟踪到我们的结果。极端的情况是不使用单步执行,每个语句都加上断点来执行。另外一种可能情况是,虽然一个线程是一个执行序列,但其它的线程也可能也是执行的这样一段代码,这样可能会出现执行到第五条语句时,突然又跳到第一条语句执行。对于这种情形,我们在创建线程时,给线程一个唯一ID来标识线程,这样在跟踪时就知道当前是不是我们要跟踪的线程在运行了。

 

n         Q:有些问题只有在现场才能发现,有没有一种技术,能否设置一个开关变量,如果打开,则输出调试信息,否则,就不执行输出调试信息,提高效率?

A:的确,现在发现有些问题只出现在现场,在测试环境中无法重现,或者是需要费很大的力气,才能重现问题,这也给我们带来额外的维护量。具体说,这并非是一个技术问题,因为只需要增加一个开关变量,就可以在输出与不输出间进行选择,这只是一个编程习惯问题:

1)      是否在程序的关键位置(或者容易出错的位置,比如连接数据等位置)加入了有用的信息。

2)      是否使用了统一的输出类,这样可以将这些信息输出到同一个位置,或决定是否输出(否则,输出到不同的位置,有的输出,有的不输出,易引起混乱)。

  

阅读全文
0 0

相关文章推荐

img
取 消
img