查看内核函数调用的调试方法【原创】

方法一、

通过打印函数地址,可以查看函数在哪里调用

例如:

Core.c   drivers\pwm

int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)

{

if (!pwm || period_ns == 0 || duty_ns > period_ns)

return -EINVAL;

printk("%s  drivers\pwm Core.c----(%d)\r\n", __func__, __LINE__);

printk("pwm->chip->ops->config=%p----(%d)\r\n", pwm->chip->ops->config, __LINE__);

return pwm->chip->ops->config(pwm->chip, pwm, duty_ns, period_ns);

}

终端显示如下:

[   42.550000] pwm->chip->ops->config=c001b0c0----(378)

然后可以在

如下目录

Z:\linux-3.6.5

中的System.map中找到

c001b0c0  t  asiu_pwmc_config

就调用的是这个函数asiu_pwmc_config

方法二、

dump_stack()函数

欢迎交流

如有转载请注明出处

新浪博客:http://blog.sina.com.cn/u/2049150530
博客园:http://www.cnblogs.com/sky-heaven/
知乎:http://www.zhihu.com/people/zhang-bing-hua

时间: 2024-10-08 13:38:52

查看内核函数调用的调试方法【原创】的相关文章

Linux内核死机调试方法总结

使用空指针和缓冲区溢出是产生oops的两个最常见原因. 1.直接查看oops信息,首先查找源代码发生oops的位置,通过查看指令寄存器EIP的值,可以找到位置.再查找函数调用栈可以得到更多的信息.从函数调用栈可辨别出局部变量,全局变量和函数参数.较为重要的信息就是指令指针(EIP),即出错指令的地址. 例如:在函数faulty_read的oops信息的函数调用栈中,栈顶为ffffffff,栈顶值应为一个小于ffffffff的值,为此值,说明再找不回调用函数地址,说明有可能因缓冲区溢出等原因造成指

Ubuntu12.04 查看内核版本以及系统位数

查看内核的几种方法: 1. uname -a   #显示详细的内核信息, Linux localhost.localdomain 2.6.18-92.1.6.el5xen #1 SMP Wed Jun 25 12:56:52 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux 2. cat /etc/issue   #显示版本类型 Scientific Linux SL release 5.2 (Boron)Kernel \r on an \m 3. cat /pro

Linux内核调试方法总结之反汇编

Linux反汇编调试方法 Linux内核模块或者应用程序经常因为各种各样的原因而崩溃,一般情况下都会打印函数调用栈信息,那么,这种情况下,我们怎么去定位问题呢?本文档介绍了一种反汇编的方法辅助定位此类问题. 代码示例如下: #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <execinfo.h> #include <fcntl.h> #include <

Linux内核调试方法总结

一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2  dump_stack() 五  printk() 1  printk函数的健壮性 2  printk函数脆弱之处 3  LOG等级 4  记录缓冲区 5  syslogd/klogd 6  dmesg 7 注意 8 内核printk和日志系统的总体结构 9  动态调试 六  内存调试工具 1  MEMWATCH 2  YAMD

Linux内核调试方法总结之调试宏

本文介绍的内核调试宏属于静态调试方法,通过调试宏主动触发oops从而打印出函数调用栈信息. 1) BUG_ON 查看bug处堆栈内容,主动制造oops Linux中BUG_ON,WARN_ON用于调试,比如 #define BUG_ON(condition) do { / if (unlikely((condition)!=0)) / BUG(); / } while(0) 如果觉得该condition下是一个BUG,可以添加此调试信息,查看对应堆栈内容 具体的BUG_ON最终调用__bug _

Linux内核调试方法总结之ptrace

ptrace [用途] 进程跟踪器,类似于gdb watch的调试方法 [原理][详细说明参考man ptrace帮助文档] ptrace系统调用主要是父进程用来观察和控制子进程的执行过程.检查并替换子进程执行序列或者寄存器值的一种手段.主要用于实现断点调试和跟踪系统调用. [接口说明] #include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); 序

Linux内核调试方法总结之序言

本系列主要介绍Linux内核死机.异常重启类稳定性问题的调试方法. 在Linux系统中,一切皆为文件,而系统运行的载体,是一类特殊的文件,即进程.因此,我尝试从进程的角度分析Linux内核的死机.异常重启等问题.在内核空间,内核本身是一个特权级的进程,它包含一系列系统级线程,维护整个系统内核的运转.在用户空间,有很多用户进程实现不同的功能,它们有的是独立运行,有些相互之间有依赖(同步或者互斥).在32位系统中,内核进程独享3GB~4GB的高1GB内存空间,而每个用户进程则分别占据0GB~3GB的

Linux UML 内核调试方法

Linux UML 内核调试方法小结 一 UML环境的搭建 1 下载內核 从官网www.kernel.org 选择版本 linux-3.10.57.tar.xz 解压到相应路径 ????/opt/um/linux-3.10.57 ? 2 基于 um的内核配置 #cd /opt/um/linux-3.10.57 #cp cd /boot/config-3.8.13.13-cdos .config # make olddefconfig ARCH=um ? 为方便进行调试,修改配置文件 #make

Linux内核调试方法总结之ftrace

ftrace [用途] ftrace包含一系列跟踪器,用于不同的场合,比如跟踪内核函数调用(function tracer).跟踪上下文切换(sched_switch tracer).查看中断被关闭的时长(irqsoff tracer).跟踪内核中的延迟以及性能问题等.Ftrace是内建于Linux的内核跟踪工具,依赖于内核配置宏(Kernel Hacking->Tracers)和debugfs. [原理]                         ftrace本质上是一种静态代码插装技术