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的。

回调函数定位(如何根据函数指针获得函数名)相关推荐

  1. 函数指针,指针函数,返回值为指针的函数

    摘要: 在学习C语言时,一个比较容易混淆的概念就是函数指针.指针函数.返回值为指针的函数.本文将对这三个概念进行区分.指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同.函数指针就是一 ...

  2. (转)函数指针,指针函数,指向函数的指针,返回指针的函数

    摘要: 在学习C语言时,一个比较容易混淆的概念就是函数指针.指针函数.返回值为指针的函数.本文将对这三个概念进行区分.指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同.函数指针就是一 ...

  3. step1 . day10 C语言基础练习之指针和函数

    最近指针和字符串.函数一系列的结合整的有点蒙,梳理了一下终于有点眉目了,用代码练习了一下 1,指针函数(返回值是指针的函数) #include <stdio.h> char * fun(c ...

  4. 常量 数组 函数 枚举 结构体与指针

    与指针括起来的是指针(*a) int const *a = &b; /* 常量指针 */ int (*a)[5]; /* 数组指针 */ int (*add)(int a, int b); / ...

  5. 深入理解C语言系列之函数传参的那些事儿(函数参数、指针、地址、数组)

    文章目录 一.指针与函数之间的关系 二.复制传参 三.地址传参 四.传一维数组(地址) 五.传二维数组(地址) 六.传指针数组(地址) 七.指针函数和函数指针 一.指针与函数之间的关系 1.我们可以给 ...

  6. 【C语言学习笔记】26. 指针(3)指向指针的指针、传递指针给函数

    前言 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链.通常,一个指针包含一个变量的地址.当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置. ...

  7. 指针数组,数组指针,函数指针,指针函数,函数指针数组

    指针数组:它是一个数组,数组里面装的是类型相同的指针.数组占多少个字节由数组本身的大小决定. 如:int *p[5]; //p为数组名,第一个元素为p[0]. 数组指针:其本身就是一个指针,它指向一个 ...

  8. C语言返回指针的函数,指针函数,让一个函数返回一个字符串

    C语言函数返回指针的函数(指针函数) 什么是返回指针的函数 一个函数可以返回一个整形值 字符型值 实型值 1.如果一个函数它的返回值是一个地址(是一个指针的话),这个函数是一个返回值是指针即指针函数. ...

  9. C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转

    目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...

  10. c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数

    函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定 int add(int i,int j) 的类型是 int(int , int) 3.C语言中通过ty ...

最新文章

  1. 201521123016《Java程序设计》第12周学习总结
  2. 10行代码实现目标检测,请收下这份教程
  3. CONVERT_YEAR_WITH_THRESHOLD
  4. 用Unity3D实现简单的牧师与魔鬼游戏
  5. java 读取properties文件
  6. python终止线程_Python里怎么终止一个线程
  7. 腐蚀和膨胀(erode and dilate)
  8. Swift - RunTime(动态性) 问题 浅析
  9. 感谢大家对《软件性能测试与Loadrunner实战》的支持
  10. 网络工程师 名词解释
  11. java彩票程序_java程序设计 彩票购买抽奖程序 团队博客
  12. 常见的一些反爬虫策略(上篇)-Java网络爬虫系统性学习与实战系列(9)
  13. 计算机存储单元的唯一标志是,存储单元的唯一标志是什么
  14. 利用 安装oracle依赖包,使用yum快速安装oracle11g依赖包
  15. 二元非洲秃鹫优化算法(Matlab代码实现)
  16. PE头解析(仅限于PE头)
  17. 2019CCPC女生专场赛_K - Tetris_打表/模拟_暴力之王
  18. 验房师去哪找靠谱,验房项目以及验房整改建议,精装房验房项目、毛坯房验房项目
  19. CCTech:测试同学如何参与codereview?
  20. NYOJ 541 最强DE 战斗力(大数水)

热门文章

  1. 什么是软件测试、生命周期、软件开发模型、测试模型
  2. 3.3 数据成员的存取
  3. 数字信号处理翻转课堂笔记3
  4. 入对行,跟对人,努力喜欢你周围的人
  5. 【JS】倒计时(数字倒数)--与日期无关
  6. c语言eof不起作用,c语言中EOF的用法
  7. 游戏渲染技术:前向渲染 vs 延迟渲染 vs Forward+渲染(二)
  8. 开源与闭源的斗争,GPLv3协议的发布
  9. MRI相关的基本概念
  10. win10更新补丁后造成wifi共享笔记本无法联网情况