2018年6月27日 星期三

kernel RIP location map to c code

1. rpm2cpio kernel-debuginfo-3.10.0-693.11.1.el7.es.9.x86_64.rpm | cpio -idm
[kevin@se129 kernel-debuginfo]$ rpm2cpio kernel-debuginfo-3.10.0-693.11.1.el7.es.9.x86_64.rpm | cpio -idm

[kevin@se129 kernel-debuginfo]$ cd usr/lib/debug/lib/modules/3.10.0-693.11.1.el7.es.9.x86_64/kernel/drivers/md/bcache/

[kevin@se129 bcache]$ gdb escache.ko.debug
(gdb) l *(read_dirty+0x3e5)
0x23ef5 is in read_dirty (drivers/md/bcache/writeback.c:235).
230     in drivers/md/bcache/writeback.c

drivers/md/bcache/writeback.c
235         BUG_ON(ptr_stale(dc->disk.c, &w->key, 0));

比較怪的是,從gdb看到的read_dirty addr跟objdump看到的不一樣:
(gdb) p read_dirty
$1 = {void (struct cached_dev *)} 0x23b10 <read_dirty>

objdump -d escache.ko  |  grep  "\<read_dirty\>"
0000000000023ae0 <read_dirty>:
   23ae0:       e8 00 00 00 00          callq  23ae5 <read_dirty+0x5>

   23ec5:       0f 0b                   ud2

一開始看0x23ae0+0x3e5=0x23ec5的位置"ud2"看不出來發生什麼事,後來才直接用gdb l*(read_dirty+0x3e5)才找到writeback:235.

沒有留言:

張貼留言

kgdb

--0313-- ken 不好意思 请教一下 之前你有交过我 在没有coredump的情况下 可以用gdb直接载入ko.debug, 然后dis -l register_bcache, 我记得使用方式是不是这样, 不过我现在dis -l出现错误^^" [root@...