c语言调试技巧,嵌入式C语言代码的调试技巧

在项目开发的过程中,不可避免的会遇到调试代码的情况。

刚开始写代码时,我们想看具体执行到哪儿时,往往这么写:

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);

即可实现调试信息正常输出,如下图所示:

8fd73741037d0ae01d807d9c3b2bcf0c.png

注意:

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语法,示例如下: &lt ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值