回调函数定位(如何根据函数指针获得函数名)
1 吐槽
回调函数一个让人看着就有点神秘色彩的名字,说白了就是函数指针,linux内核中大量使用这种东西,这么做好像说是可以提升代码的可扩展性吧。跟java、go等高级语言里的接口、抽象类等概念有得一拼。
不管什么原因要使用回调函数或者接口之类的东西吧,使用这了些东西之后,这份代码在不运行它的情况下基本上就算是不可读了。这好像也是我们一直看不懂linux内核的代码的原因,想像一下当我们读代码,一直追踪函数调用的时候,最后追踪到调用了一个函数指针,然后我们想这个指针指向谁呢?于是我们就得去找这个指针在哪赋了值,然后全局搜索变量名,我们太天真了,linux内核中会把这个赋值语言“藏”得很深,甚至会发现这个函数指针的值是根据用户输入来确定的。
不运行代码就读不懂这些使用回调函数、接口或抽象类的代码,这可不是本人下的结论,而是它们自己说的。所谓“运行时绑定”,不就是不运行就不绑定,不绑定就不知道它到底实际调用了哪个函数或都接口实现吗?
虽然难受,但是以前到现在大多人都这么写代码,我们也只好想办法把这恶心的东西吃下去,所以本文算是想办法给这东西加些香料吧。本文提供的方法也需要把代码运行起来的。
2 linux内核中根据函数指针追踪调用函数名
linux内核的printks可以输出函数指针对应的函数名。
printk("func: %pF at address: %p\n", func, func);
当然,经过本人的实际实验,这个 %pF好像不能输出函数名,真正可用的是 %pS,而且%p也不能直接输出内核指针的值,而要用%px,因此上面的代码应该改为
printk("func: %pS at address: %px\n", func, func);
我们可以只输出指针地址,然后去系统目录下的: /proc/kallsyms 文件中根据指针值查相应的函数名,这个文件也是 printk %pS的实现原理。
3 linux/mocos用户态下的C语言应用程序
#include <stdio.h>
#include <execinfo.h>
int test1(int a){printf("%s\n", __func__);printf("%d\n", a);return 0;
}
int test2(int b){return 1;
}
int main() {int (*p)(int a) ;p = test2 ;p(10);backtrace_symbols_fd(&p, 1, 1);
}
编译命令:gcc a.c -rdynamic
输出:
4 其他语言
连C语言都有这种根据函数指针输出函数名方法,我们应该相信其他应该也一定有。现在我知道Go语言里的反射机制有什么用了,用来吃X的。
回调函数定位(如何根据函数指针获得函数名)相关推荐
- 函数指针,指针函数,返回值为指针的函数
摘要: 在学习C语言时,一个比较容易混淆的概念就是函数指针.指针函数.返回值为指针的函数.本文将对这三个概念进行区分.指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同.函数指针就是一 ...
- (转)函数指针,指针函数,指向函数的指针,返回指针的函数
摘要: 在学习C语言时,一个比较容易混淆的概念就是函数指针.指针函数.返回值为指针的函数.本文将对这三个概念进行区分.指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同.函数指针就是一 ...
- step1 . day10 C语言基础练习之指针和函数
最近指针和字符串.函数一系列的结合整的有点蒙,梳理了一下终于有点眉目了,用代码练习了一下 1,指针函数(返回值是指针的函数) #include <stdio.h> char * fun(c ...
- 常量 数组 函数 枚举 结构体与指针
与指针括起来的是指针(*a) int const *a = &b; /* 常量指针 */ int (*a)[5]; /* 数组指针 */ int (*add)(int a, int b); / ...
- 深入理解C语言系列之函数传参的那些事儿(函数参数、指针、地址、数组)
文章目录 一.指针与函数之间的关系 二.复制传参 三.地址传参 四.传一维数组(地址) 五.传二维数组(地址) 六.传指针数组(地址) 七.指针函数和函数指针 一.指针与函数之间的关系 1.我们可以给 ...
- 【C语言学习笔记】26. 指针(3)指向指针的指针、传递指针给函数
前言 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链.通常,一个指针包含一个变量的地址.当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置. ...
- 指针数组,数组指针,函数指针,指针函数,函数指针数组
指针数组:它是一个数组,数组里面装的是类型相同的指针.数组占多少个字节由数组本身的大小决定. 如:int *p[5]; //p为数组名,第一个元素为p[0]. 数组指针:其本身就是一个指针,它指向一个 ...
- C语言返回指针的函数,指针函数,让一个函数返回一个字符串
C语言函数返回指针的函数(指针函数) 什么是返回指针的函数 一个函数可以返回一个整形值 字符型值 实型值 1.如果一个函数它的返回值是一个地址(是一个指针的话),这个函数是一个返回值是指针即指针函数. ...
- C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转
目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...
- c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数
函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定 int add(int i,int j) 的类型是 int(int , int) 3.C语言中通过ty ...
最新文章
- 201521123016《Java程序设计》第12周学习总结
- 10行代码实现目标检测,请收下这份教程
- CONVERT_YEAR_WITH_THRESHOLD
- 用Unity3D实现简单的牧师与魔鬼游戏
- java 读取properties文件
- python终止线程_Python里怎么终止一个线程
- 腐蚀和膨胀(erode and dilate)
- Swift - RunTime(动态性) 问题 浅析
- 感谢大家对《软件性能测试与Loadrunner实战》的支持
- 网络工程师 名词解释
- java彩票程序_java程序设计 彩票购买抽奖程序 团队博客
- 常见的一些反爬虫策略(上篇)-Java网络爬虫系统性学习与实战系列(9)
- 计算机存储单元的唯一标志是,存储单元的唯一标志是什么
- 利用 安装oracle依赖包,使用yum快速安装oracle11g依赖包
- 二元非洲秃鹫优化算法(Matlab代码实现)
- PE头解析(仅限于PE头)
- 2019CCPC女生专场赛_K - Tetris_打表/模拟_暴力之王
- 验房师去哪找靠谱,验房项目以及验房整改建议,精装房验房项目、毛坯房验房项目
- CCTech:测试同学如何参与codereview?
- NYOJ 541 最强DE 战斗力(大数水)