在项目开发的过程中,不可避免的会遇到调试代码的情况。
刚开始写代码时,我们想看具体执行到哪儿时,往往这么写:
printf("***** Code is here! *****\n");
随着调试信息的不断增多,我们项目中的printf()函数到处都是,因此,当调试完成时,发现需要注释掉所有的调试代码将非常痛苦。于是,我们通过宏定义对代码进行了这样的改造:
首先,定义调试宏:
#define _DEBUG_IS_MY
然后,在需要添加调试代码的地方,添加以下代码:
#ifdef _DEBUG_IS_MY
printf("***** Code is here! *****\r\n");
#endif
这样,似乎解决了问题,但这会使项目代码显得很臃肿,并且太多重复代码(#ifdef _DEBUG_IS_MY ……#endif),这是程序员不能容忍的。
因此,参考很多底层代码和网络资料,看到确实已经有很优秀和成熟的写法:
/*
* 自定义调试宏。
* 1.快速切换debug版本和relese版本工程
* 2.简化打印调试语句的编写,提高开发调试效率
*/
#define _MY_DEBUG_ 1
#ifdef _MY_DEBUG_
#define MY_DEBUG_PRINT_INFO(...) printf(__VA_ARGS__)
#define MY_DEBUG_PRINT_VAR(X, ...) printf("file: "__FILE__", Line: %d:"X"\r\n",__LINE__,##__VA_ARGS__)
#else
#define MY_DEBUG_PRINT_INFO(...)
#define MY_DEBUG_PRINT_VAR(X, ...)
#endif
在程序中需要添加调试代码处,直接调用:
MY_DEBUG_PRINT_INFO("code is here!");
或
MY_DEBUG_PRINT_VAR("code is here!");
或
MY_DEBUG_PRINT_VAR("recev_flag = %d .", recev_flag);
即可实现调试信息正常输出,如下图所示:
注意:
1、windows下的回车换行符为“\r\n”。
2、用到了预定义宏,这些宏提供了当前编译和编译器本身的信息。
__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
以上两个宏,还可以用作错误检测。例如被零除的问题。
#define CHECK_ZERO(divisor) \
if (0 == divisor) \
printf("attemp to divide by 0 on line %d of file %s ***\r\n", __LINE__, __FILE__);
CHECK_ZERO宏应该在除法运算前被调用。
CHECK_ZERO(j);
k = i / j;
如果 j为0,会打印出以上提示语。
参考以下博客:
1、http://www.360doc.com/content/14/0703/10/7324690_391662898.shtml
2、http://blog.csdn.net/aobai219/article/details/6092292
3、http://blog.csdn.net/cp1300/article/details/7773239
4、《C语言程序设计现代方法》
浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码
浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...
嵌入式C语言优化小技巧
嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的 ...
C语言中的调试小技巧
C语言中的调试小技巧 经常看到有人介绍一些IDE或者像gdb这样的调试器的很高级的调试功能,也听人说过有些牛人做工程的时候就用printf来调试,不用特殊的调试器.特别是在代码经过编译器一些比较复杂的 ...
数据库系统学习(九)-嵌入式SQL语言之基本技巧
第九讲 嵌入式SQL语言之基本技巧 901 什么是嵌入式SQL语言 交互式SQL语言的局限性 嵌入式SQL语言 交互式和嵌入式语言的对比 高级语言中使用嵌入式语言需要解决的问题 902 程序与数据库连 ...
第14讲:嵌入式SQL语言(基本技巧)
一.交互式SQL的局限 & 嵌入式SQL的必要性 专业人员(如DBA)可以熟练地运用交互式SQL语言,但普通用户却不是那么容易上手,所以需要通过数据库应用程序来使用数据库.编写一个可以与数据库 ...
【工具】VS2010常用调试技巧(1)
调试是一个程序员最基本的技能,其重要性不言自明.不会调试的程序员就意味着他即使会一门语言,却不能编制出好的软件.本文就本人在开发过程中常用的调试技巧作下简单呢介绍,希望对大家有所帮助,能力超群者请绕道 ...
iOS各种调试技巧豪华套餐
转载自http://www.cnblogs.com/daiweilai/p/4421340.html 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Global Break ...
Visual Studio原生开发的20条调试技巧(下)
我的上篇文章引发了很多人的兴趣,所以我决定跟大家分享更多的调试技巧.接下来你又能看到一些对于原生应用程序的很有帮助的调试技巧(接着上 ...
xcode的调试技巧
转自:http://www.cnblogs.com/daiweilai/p/4421340.html#biyouji 目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global ...
随机推荐
.NET 的 Debug 和 Release build 对执行速度的影响
这篇文章发布于我的 github 博客:原文 在真正开始讨论之前先定义一下 Scope. 本文讨论的范围限于执行速度,内存占用什么的不在评估的范围之内. 本文不讨论算法:编译器带来的优化基本上属于底层 ...
mysql in 的两种使用方法
简述MySQL 的in 的两种使用方法: 他们各自是在 in keyword后跟一张表(记录集).以及在in后面加上字符串集. 先讲后面跟着一张表的. 首先阐述三张表的结构: s(sno,sname. ...
PHPCMS V9 简单的二次开发
更多二次开发技巧,查看phpcms系统帮助 ,前台模板解析后的缓存 caches\caches_template\default 前台控制类index.php,前台标签类*_tag.class.php ...
textarea中的空格与换行
当在一个textarea标签中键入一个回车时,实际上会插入2个符号:\n\r在javascript里, line breaks用\n表示when you pull text into Javascri ...
LDF文件过大的解决办法
检查扎兰屯服务器的时候,发现其中一个分区的原空间有300多个G,但只余下了80多个G.检查了一下,发现某库ldf文件过大,竟然达到了280多个G. 这如何得了,再这样下去,硬盘怎能受得了? 尝试用收缩 ...
Jquery学习笔记: attr和 prop的区别,以及为html标签自定义属性
一.自定义html标签属性 对于html文件中的html标签,可以自定义属性,如:
Hibernate之环境搭建
开始之前,我想先理清一个概念,即ORM是什么? ORM介绍 全称:Object/Relation Mapping,即对象/关系映射. ORM也可以理解为一种规范,具体的ORM框架可作为应用程序和数据库 ...
如何修改全部DevExpress控件的字体
引用:https://www.devexpress.com/Support/Center/Question/Details/A2761 You can change the default font ...
简述angular自定义过滤器在页面和控制器中的使用
首先设置自定义过滤器. 定义模块名:angular ? 1 2 3 4 5 6 .module('myApp') .filter('filterName',function(){ return fun ...
Markdown 插入图片技巧
在使用Markdown编写博客或文件的时候,经常会需要插入图片.如果使用Markdown语法,我们会发现调整图片的大小会是个问题. 所以推荐使用另一种办法插入图片,使用HTML语法,示例如下: < ...