快速定位函数指针所指向的函数原型

在大型开源软件和Linux内核中,函数指针广泛用于实现动态调用。例如,VFS接口通过函数指针调用不同文件系统的读写接口。当debug时,面对多个可能的函数指针目标,如何快速定位实际执行的函数?通过在调用前打印函数指针地址,结合`nm`工具,可以迅速找到对应函数原型。具体步骤包括:打印函数指针地址,然后在ELF文件中使用`nm`命令搜索该地址,从而确定函数调用路径。
摘要由CSDN通过智能技术生成

在一些大型开源软件中,通常会有函数指针的应用,函数指针可以让程序在运行过程中,动态的的去调用对应的回调函数。

linux内核代码中,也有大量的函数指针应用。

例子:

linux中支持大量的文件系统,如ramfs,ext3,ext4,jffs2,procfs,sysfs,nfs,debugfs,等等等,这些文件系统通过VFS虚拟文件系统统一接口,来实现调用具体文件系统的读写接口。这里就会用到函数指针来实现。比如:app在一个目录中创建文件,并向这个文件写入数据。这种情况下,不同的文件系统,会调用不同的read、write接口。因为每种文件系统的设计思想和实现方法都不一样。每种文件系统都有自己的一套读写接口。

 

问题:当我们debug一个程序时,通过printk等方式定位到程序走进了一个函数指针,而这个函数指针所指向的具体函数可能有好几十个。这种情况下,我们如何知道程序到底跑到哪了呢??

如果采用非常笨的方法,比如,把所有该指针可能指向的函数原型中添加打印,然后执行程序,通过打印信息看到底走了哪一个回调。显然比较慢。

方法:

我们可以通过函数的执行地址+nm工具,来快速定位函数的走向。

(1)在程序调用函数指针前,用printk打印出函数指针的地址。

(2)通过函数符号地址,在elf文件中查找该地址。nm

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值