momo zone

调核人的blog

如何从oops或panic 中获得源代码

1. 最简单的

addr2line -f -e vmlinux 0xXXXXXXXX

2.使用crash 工具

这个功能就多了,启用方法是执行crash,增加模块到crash 环境:

mod -s <mod_name> <path/to/ko>

然后l *0xXXXXXXXXXXXXXXXX

如果是func+偏移的形式可以用这种 l *func+0xXXXXXXXXXXXXXXXX

另外几个比较强力的用法:

打印所有任务的堆栈:foreach bt -tf

打印结构定义,并配合地址参数显示结构中的成员变量: struct timespec xtime 左边是结构体定义,右边是结构体变量

根据符号名称显示原型 : whatis modules

遍历列表:list pdev2 -s mydev_s 左边是包含list的结构体变量,右边是需要遍历出来的结构体,(结构体定义)

打印:p , carsh 中的p 非常智能,如果参数是符号名称,他能够自动查找符号原型来格式化输出。

3. 使用gdb

gdb vmlinux /proc/kcore

对于内核模块,还要使用出自LDD3 P104的方法:

add-symbol-file <ko> 0xXXXXXXXX  -s .bss <addr> -s .data <addr>

.bss .data 获取方法可以 cat /sys/module/<module_name>/sections/.bss    ,cat /sys/module/<module_name>/sections/.data

接下来就用crash 的方法了,不同的是crash dump 出的数据是实时的,而gdb 要用load 来重新挂载才能更新。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s

%d 博主赞过: