
C语言调试
寒江独钓2009
嵌入式软件开发,C语言编程,USB、IIC、SPI、SD、串口开发,存储芯片开发。系统启动引导开发,Linux内核驱动开发。
展开
-
介绍一下内存泄漏工具valgrind的使用
valgrind是一款开源内存检测的工具,里面包含了很多的工具,一般使用Memcheck这个工具偏多;Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。注:代码编译时我们要带上参数-g,有了符号表才可以显示行号这些东西;valgrind工具命令参考:valgrind --tool=memcheck --leak-check=full --show-..原创 2020-09-15 15:39:38 · 497 阅读 · 0 评论 -
利用宏定义在源程序中转化已定义函数增加调试信息的方法
有段时间没写博客了,写个调试方法留作纪念。下面这个方法,特别是内核驱动代码,在去查某个源文件中,所有调用读写寄存器,readl、writel等,挺有用。方法类似,在printk加入一个 count++的静态寄存器,可在log显示读写的过程顺序。方法简单提取如下://a.cint func(int n){ return 34;}//a.h#ifndef _A_...原创 2019-10-19 15:05:45 · 249 阅读 · 0 评论 -
关于gcc的扩展宏定义中, "#" 和 "##"的含义
"#" 代表和一个字符串相连接 "##" 代表和一个符号相连接,符号可以是变量,或另一个宏符号举例如下:#include<stdio.h>#define FILE_NAME "/dev/tty"#define FILE_NAME2 "/dev/console"// '#' use example#define FILE_OPEN1(fd,n) \{ \ fd =...原创 2018-03-19 22:10:18 · 2028 阅读 · 0 评论 -
一个移植十分方便的malloc函数族的实现
相信学习过c语言的人都知道malloc、free函数,这里就不多说怎么用了。这里要说的是:提供它们的实现。 该实现方法由uboot中malloc等函数的实现改编而来。已经过验证,没有问题。 ------多说一句,该实现支持物理地址malloc、free。。。,不支持虚拟地址的映射 该malloc的源码实现,很方便移植。特别是在BootLoader或者单片机开发过程中,原创 2017-08-05 08:57:06 · 6212 阅读 · 0 评论 -
使用gcc给待编译C/C++源码注入宏的2种方法
第一种方法:gcc “源码” -D“你要定义的宏” -o “可执行文件”示例源码://test.c:#include int main(int argc,char *argv[]){#ifdef ZKJprintf("===ZKJ has been defined===\n");#elseprintf("===ZKJ has not been defin原创 2017-01-21 16:33:39 · 1430 阅读 · 0 评论 -
关于如何在make一个Linux下的C/C++工程时,自动添加版本号、编译日期等信息
本篇的目的:在makefile里,将系统当前的时间传递进待编译的C/C++工程中,用以指示编译执行的时间,以及版本信息等。不多说了,先来看效果:当前时间:编译完成后运行效果:。。。。。。过了3分钟后,再次编译运行:注意箭头指向的时间的变化。下面贴代码:这就是关于如何make一个Linux下的C/C++工程时,自动添原创 2017-01-20 00:35:23 · 8435 阅读 · 0 评论 -
一句printf搞定一个数组的矩阵输出。
今天在工作的时候,看到一位同事写的一个打印数组输出,矩阵格式的。写得一堆堆的。功能是实现了,但是代码个人感觉不太简洁。。。因此,自己也想了一下。做出了下面的方法,供大家参考。先看下怎么回事:打印输出格式示意:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2原创 2016-12-16 22:25:01 · 11972 阅读 · 1 评论 -
dump_stack介绍以及内核符号表的生成和查找过程
内核中的dump_stack()获得内核中当前进程的栈回溯信息需要用到的最重要的三个内容就是:栈指针:sp寄存器,用来跟踪程序执行过程。返回地址:ra寄存器,用来获取函数的返回地址。程序计数器:epc,用于定位当前指令的位置。本文的内容都是基于mips体系架构的,如果你不搞mips,就只看个大致流程就可以了,不然可能会被某些内容误导。在ARM中,这三个寄原创 2016-12-11 22:12:18 · 4466 阅读 · 2 评论 -
一个优秀的debug函数(宏)
调试用的宏debug函数(宏),可以显示你debug所在的文件名,函数名,行号。例子里使用的是基于printf函数来做。纯c代码,不多说了,直接上源码://t.c#include #define debug(argc,argv...) ({printf("%s:%s:%05d=>",__FILE__,__func__,__LINE__);printf(argc,##argv); })原创 2016-04-24 10:26:53 · 4906 阅读 · 0 评论 -
一个优秀的debug宏,更新
调试用的debug宏,更新。可以显示你debug所在的文件名,函数名,行号。例子里使用的是基于printf函数来做。纯c代码,不多说了,直接上源码://t.c#include #define MYDEBUG#ifdef MYDEBUG#define myDebug(fmt,...) printf("%s:%s:%05d=>"fmt"",__FILE__,__func__,__原创 2016-05-18 22:34:18 · 563 阅读 · 0 评论 -
一个移植十分方便的类似printf函数
一个十分便于移植的类似printf函数,已测试通过。只需要实现SendChar()函数,把你要外发的字符(比如:发送到串口,显示屏等)写在这里即可。里面部分使用Renasas的源码,在这里尊重其版权。供大家使用,也请尊重我个人的辛勤汗水哈~源码如下:/*---------------------------------------------------------------------原创 2016-04-22 22:29:52 · 1204 阅读 · 0 评论 -
一个移植十分方便的类似printf函数,升级版
升级版,不包含任何头文件,“独立生存\(^o^)/~”。一个十分便于移植的类似printf函数,就当做printf使用就可以了(注:不支持浮点型数),已测试通过。只需要实现SendChar()函数,把你要外发的字符(比如:发送到串口,显示屏等)写在这里即可。供大家使用。打字不易,转载请注明出处,谢谢!//Printf.c/*---------------------------------原创 2016-05-05 01:32:47 · 804 阅读 · 1 评论