开源代码分析技巧之——打印调用逻辑

 

开源代码分析技巧之——打印调用逻辑

 

        在研究开源代码时,大家或许都有这样的感慨:

      (1)代码太庞大,少则几万行代码,多则几百万行代码,不知道如何入手

      (2)相关的帮助文档有限,很难短时间内理清头绪

      (3)有了代码在手,但代码之间的调用相当复杂,一层一层追踪总是理不清调用逻辑顺序。

 

        1、从SAMBA源码说起

 

        笔者在研究kerberos认证时,需要开源的samba软件。如下是samba的官网:http://www.samba.org/

       

 

       Samba最新版本为4.1.10,统计得出其中.c.cpp的文件有近4000个,累计代码近百万行。所以对其的全面分析有一定难度。当然,我们可以根据所需,缩小范围,从指定所需的指令对应的代码追溯代码调用逻辑。

 

       2、给源码插入“调用逻辑线索”代码

 

       即便如此,有时还是想直观看下某个模块的调用顺序,能不能直观的打印出来?而如何打印调用逻辑呢?如果每个函数的头部都加上:文件名、函数名、行号的打印语句,这样不就解决了我们的问题了吧。

       而编译器里内置了宏,如下几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。

       ANSI C标准中有几个标准预定义宏(也是常用的)

     __LINE__:在源代码中插入当前源代码行号;__FILE__:在源文件中插入当前源文件名;__DATE__:在源文件中插入当前的编译日期__TIME__:在源文件中插入当前编译时间;__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;__cplusplus__:当编写C++程序时该标识符被定义;__FUNCTION__:在源文件中插入函数名。

        编译器在进行源码编译的时候,会自动将这些宏替换为相应内容。

       于是,printf(“File: %s, Function: %s, Line: %s.\n”, __FILE__, __FUNCTION__, __LINE__);这个C的语句就是我们所需的。

       于是,问题就有所转嫁:给指定文件夹下的所有.c.cpp文件下的所有函数的第一行插入“printf(“File: %s, Function: %s, Line: %s.\n”, __FILE__, __FUNCTION__, __LINE__);”标记打印语句(以下统称)。

 

       3思路分析

 

      完成任务:给指定文件夹下的所有.c.cpp文件下的所有函数的首行插入指定代码。

      输入:包含源码的文件夹路径名,如:存储samba源码的路径名——C:\tmp\samba4.0.9

      中间处理:遍历、处理、添加标记打印语句。

      输出:无。

     任务分解如下:

      Step1遍历指定文件夹及其所有子文件夹,将所有文件路径存入容器vector_all_dir

      Step2:遍历容器vector_all_dir,将后缀为.c.cpp的文件存入容器vector_ctype_dir

      Step3:遍历容器vector_ctype_dir的每一个路径,打开路径对应的每个文件—>读取文件内容存入buffer-->清空原有文件内容;

      Step4读取buffer的内容,循环遍历buffer,找到函数头开始的标记)\n{”,并记录其对应位置position,在poisition+strlen()\n{)后插入标记打印语句。这样就生成了新的buffer——buffer_after_newadd

      Step5将新的添加标记打印语句的buffer_after_newadd重新写入源路径,关闭文件。

笔者已经完毕代码,在samba4.0.9测试,能够实现预想的调用顺序逻辑打印。

 

      4尚待改进点

 

    (1)读取buffer部分是按照字符串处理,并且是废弃以前的文件,将添加标记打印语句的新buffer写入文件的方法。效率较低,有待改进。

    (2)以)\n{”判定函数不具有一般性。第一,Windows下的换行符为\r\n,而Linux下的换行符为\n;第二,函数的书写不同比如如下的格式:格式一、格式二都很常用,都应该考虑。

      格式一:

void function( )
{}

     格式二:

void function( ){
}

 

        5结语

 

        权当是分析开源的小技巧吧,确实对自己分析开源软件提供了帮助。后续有了新的心得,会持续分享。

 

         2013/10/13 am9:55思于家中床前

 

转载于:https://www.cnblogs.com/suncoolcat/p/3367578.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 731. 我的日程安排表 II(set二分查找 / 差分思想)

文章目录1. 题目2. 解题2.1 set 二分查找2.2 差分思想1. 题目 实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内不会导致三重预订时,则可以存储这个新的日程安排。 MyCalendar 有一个 book(int start, int end)方法。 它意味着在 start 到 end 时间…

05.序列模型 W1.循环序列模型

文章目录1. 为什么选择序列模型2. 数学符号3. 循环Recurrent 神经网络模型4. 通过时间的反向传播5. 不同类型的循环神经网络6. 语言模型和序列生成7. 对新序列采样8. 循环神经网络的梯度消失9. Gated Recurrent Unit(GRU单元)10. LSTM(long s…

LeetCode 802. 找到最终的安全状态(逆向图+拓扑排序)

文章目录1. 题目2. 解题1. 题目 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走。 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止。 现在, 如果我们最后能走到终点,那么我们的起始节点是最终安全的。 更具体地说, 存在一个自然数 K…

05.序列模型 W1.循环序列模型(作业:手写RNN+恐龙名字生成)

文章目录作业1:建立你的循环神经网络1. RNN 前向传播1.1 RNN 单元1.2 RNN 前向传播2. LSTM 网络2.1 LSTM 单元2.2 LSTM 前向传播3. RNN 反向传播3.1 基础 RNN 反向传播3.2 LSTM 反向传播3.3 LSTM RNN网络反向传播作业2:字符级语言模型:恐龙岛…

SQL2008中Merge的用法

SQL2008中Merge的用法 在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已。下面就是具体的使用说明: 首先是对merge的使用说明: merge [into][目标表]usi…

LeetCode 1146. 快照数组(哈希map + 有序map)

文章目录1. 题目2. 解题1. 题目 实现支持下列接口的「快照数组」- SnapshotArray: SnapshotArray(int length) - 初始化一个与指定长度相等的 类数组 的数据结构。初始时,每个元素都等于 0。void set(index, val) - 会将指定索引 index 处的元素设置为…

LeetCode 825. 适龄的朋友(计数排序+前缀和)

文章目录1. 题目2. 解题1. 题目 人们会互相发送好友请求&#xff0c;现在给定一个包含有他们年龄的数组&#xff0c;ages[i] 表示第 i 个人的年龄。 当满足以下任一条件时&#xff0c;A 不能给 B&#xff08;A、B不为同一人&#xff09;发送好友请求&#xff1a; age[B] <…

LeetCode 954. 二倍数对数组(map计数)

文章目录1. 题目2. 解题1. 题目 给定一个长度为偶数的整数数组 A&#xff0c;只有对 A 进行重组后可以满足 对于每个 0 < i < len(A) / 2&#xff0c;都有 A[2 * i 1] 2 * A[2 * i] 时&#xff0c;返回 true&#xff1b;否则&#xff0c;返回 false。 示例 1&#xf…

LeetCode 732. 我的日程安排表 III(差分思想)

文章目录1. 题目2. 解题1. 题目 实现一个 MyCalendar 类来存放你的日程安排&#xff0c;你可以一直添加新的日程安排。 MyCalendar 有一个 book(int start, int end)方法。它意味着在start到end时间内增加一个日程安排&#xff0c;注意&#xff0c;这里的时间是半开区间&…

05.序列模型 W2.自然语言处理与词嵌入

文章目录1. 词汇表征2. 使用词嵌入3. 词嵌入的特性4. 嵌入矩阵5. 学习词嵌入6. Word2Vec7. 负采样8. GloVe 词向量9. 情感分类10. 词嵌入除偏作业参考&#xff1a;吴恩达视频课深度学习笔记自然语言处理与词嵌入 Natural Language Processing and Word Embeddings 1. 词汇表征…

Hadoop学习之HDFS

Hadoop学习之HDFS 1 HDFS相关概念 1.1 设计思路 分散存储&#xff0c;冗余备份。 分散存储&#xff1a;大文件被切割成小文件&#xff0c;使用分而治之的思想让多个服务器对同一个文件进行联合管理&#xff1b; 冗余备份&#xff1a;每个小文件做冗余备份&#xff0c;并且…

LeetCode 799. 香槟塔(DP动态规划)

文章目录1. 题目2. 解题1. 题目 我们把玻璃杯摆成金字塔的形状&#xff0c;其中第一层有1个玻璃杯&#xff0c;第二层有2个&#xff0c;依次类推到第100层&#xff0c;每个玻璃杯(250ml)将盛有香槟。 从顶层的第一个玻璃杯开始倾倒一些香槟&#xff0c;当顶层的杯子满了&…

天池在线编程 2020国庆八天乐 - 7 进制

文章目录1. 题目2. 解题1. 题目 https://tianchi.aliyun.com/oj/118289365933779217/122647324212270017 Given an integer, return its base 7 string representation. 输入范围为[-1e7, 1e7] 。 示例 样例 1: 输入: num 100 输出: 202样例 2: 输入: num -7 输出: -102.…

Hadoop学习之MapReduce

Hadoop学习之MapReduce 目录 Hadoop学习之MapReduce 1 MapReduce简介 1.1 什么是MapReduce 1.2 MapReduce的作用 1.3 MapReduce的运行方式 2 MapReduce的运行机制 2.1 相关进程 2.2 MapReduce的编程套路 2.3 MapTask的并行度 2.4 切片及其源码解读 2.5 ReduceTask的…

Hadoop学习之yarn

Hadoop学习之YARN 1 YARN简介 1.1 概述 YARN &#xff08;Yet Another Resource Negotiator&#xff09;是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而 MapReduce 等运算程序则相当于运行于操作…

天池在线编程 2020国庆八天乐 - 8. 分糖果

文章目录1. 题目2. 解题1. 题目 https://tianchi.aliyun.com/oj/118289365933779217/122647324212270016 描述&#xff1a; 给定长度为偶数的整数数组&#xff0c;该数组中不同的数字代表不同种类的糖果&#xff0c; 每个数字表示一种糖果。 您需要将这些糖果平均分配给弟弟和…

Hive基础知识

Hive基础知识 1 Hive相关概念 1.1 Hive是什么 Hive是基于 Hadoop 的一个数据仓库工具&#xff0c;可以将结构化的数据映射为一张数据库表&#xff0c;并提供 HQL(Hive SQL)查询功能&#xff0c;最终底层将HQL语句转换为MapReduce任务的&#xff0c;底层数据是存储在 HDFS 上…

天池在线编程 2020国庆八天乐 - 6. 山谷序列(DP)

文章目录1. 题目2. 解题1. 题目 https://tianchi.aliyun.com/oj/118289365933779217/122647324212270018 描述&#xff1a; 给你一个长度为 n 的序列&#xff0c;在他的子序列中让你找一个山谷序列&#xff0c;山谷序列定义为&#xff1a; 序列的长度为偶数。假设子序列的长…

天池在线编程 2020国庆八天乐 - 4. 生成更大的陆地(BFS)

文章目录1. 题目2. 解题1. 题目 https://tianchi.aliyun.com/oj/118289365933779217/122647324262601668 LeetCode 上也有该题 827. 最大人工岛 描述 在一个0和1的2D网格中&#xff0c;我们最多将一个0改为1。 之后&#xff0c;最大岛屿的大小是多少&#xff1f; &#xff0…

python操作MySQL 模拟简单银行转账操作

一、基础知识 1、MySQL-python的安装 下载&#xff0c;然后 pip install 安装包 2、python编写通用数据库程序的API规范 &#xff08;1&#xff09;、数据库连接对象 connection&#xff0c;建立python客户端与数据库的网络连接&#xff0c;创建方法为 MySQLdb.Connect(参数) 参…