嵌入式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);

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

  

注意:

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语言程序设计现代方法》

  

  

        

时间: 2024-10-29 19:07:07

嵌入式C语言代码的调试技巧的相关文章

嵌入式系统编程和调试技巧

嵌入式系统的开发,软件的运行稳定可靠是非常重要的.在芯片中,软件是没有质量的,但软件的质量可以决定一颗芯片的成败.芯片设计中,性能能否满足设计要求,除了硬件设计.软硬件配合的设计技巧,对于软件来说,编程的一些技术和技巧同样重要. 本文讲述我在芯片固件开发过程中使用的一些编程调试技巧.针对在嵌入式系统开发中常见的问题,如实时系统下的同步问题,动态内存分配的内存泄漏问题,如何在编程阶段预防BUG出现,调试阶段如何及时发现问题和定位问题.总结下经验,目的是开发一个稳定运行的固件,提高开发效率,提高运行

C语言内存调试技巧—C语言最大难点揭秘

本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内.内存错误是 C 和 C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决,它们可能严重影响应用程序,并且很少有开发团队对其制定明确的管理计划.但好消息是,它们并不怎么神秘.引言C 和 C++ 程序中的内存错误非常有害:它们很常见,并且可能导致严重的后果.来自计算机应急响应小组(请参见参考资料)和供应商的许多最严重的安全公告都是由简单的内存错误造成的.自从 70 年代末期以来,C 程序员就一直讨论此

白话开发——Android Studio代码调试技巧篇

Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样,如Eclipse.Idea,Android Studio也为我们提供了强大的调试技巧,今天我们就来看看Android Studio中有关调试的技巧. 首先,来看看Android studio中为我们提供的调试面板(标准情况下): 点击右上角Restore 'Threads'View可先展示目前相关的

VS2010常用调试技巧(1)

调试是一个程序员最基本的技能,其重要性不言自明.不会调试的程序员就意味着他即使会一门语言,却不能编制出好的软件.本文就本人在开发过程中常用的调试技巧作下简单呢介绍,希望对大家有所帮助,能力超群者请绕道. 1.单步调试(F10) 在Debug状态下,按下F10,逐行进行调试. 2.逐句调试(F11) 在调试状态下,按下F11,会逐句调试,遇到函数会进入函数内部调试. 3.跳到当前光标处(Ctrl+F10) 我经常看到有些初级程序员,为了到达目标代码位置,在程序运行前就早早设定了断点,然后反复按F1

iOS各种调试技巧豪华套餐

转载自http://www.cnblogs.com/daiweilai/p/4421340.html 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints) 打印的艺术 NSLog 开启僵尸对象(Enable NSZombie Objects) 进击的码农 Console(lldb 命令) Profile(instruments) Xcode视图调试 结语 前言 最近博主临近毕业季

xcode的调试技巧

转自:http://www.cnblogs.com/daiweilai/p/4421340.html#biyouji 目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints)打印的艺术 NSLog 开启僵尸对象(Enable NSZombie Objects)进击的码农 Console(lldb 命令) Profile(instruments) Xcode视图调试结语 前言 最近博主临近毕

iOS开发调试技巧总结(持续更新中)

作者:乞力马扎罗的雪  原文 对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的调试,有同性也有个性.今天我们就来学习一下iOS开发中的调试技巧,语言暂用为OC,IDE当然是强大的Xcode.首先说明下,Xcode已经为我们调试项目提供了极大的方便. [1.普通断点] 断点(Breakpoint)绝对是调试程序的第一大选择,也是掌握的基础技能.顾名

14 个你可能不知道的 JavaScript 调试技巧

了解你的工具可以极大的帮助你完成任务.尽管 JavaScript 的调试非常麻烦,但在掌握了技巧 (tricks) 的情况下,你依然可以用尽量少的的时间解决这些错误 (errors) 和问题 (bugs) . 我们会列出14个你可能不知道的调试技巧, 但是一旦知道了,你就会迫不及待的想在下次需要调试 JavaScript 代码的时候使用它们! 现在开始. 虽然许多技巧也可以用在别的检查工具上,但大部分的技巧是用在 Chrome Inspector 和 Firefox 上的. 1. 'debugg

[转] Xcode 高级调试技巧

在苹果的官方文档中列出了我们在调试中能用到的一些命令,我们在这重点讲一些常用的命令 调试本地文件方法(Mac OS X):(lldb) target create "/Users/piaoyun/Desktop/xx.app/Contents/MacOS/xxxx" 远程调试方法: 设备端运行: 附加进程: ./debugserver *:1234 -a "YourAPPName" 直接启动进程: debugserver -x backboard *:1234 /p