在調(diào)試發(fā)生于模塊中的 panic, 或者使用遠(yuǎn)程 GDB 調(diào)試使用動(dòng)態(tài)模塊的機(jī)器時(shí), 需要告訴 GDB 如何獲取這些模塊的符號(hào)信息。
首先, 需要在編譯模塊時(shí)加入調(diào)試信息:
# cd /sys/modules/linux
# make clean; make COPTS=-g
如果使用遠(yuǎn)程 GDB, 您可以在目標(biāo)機(jī)上執(zhí)行 kldstat 來了解模塊的加載位置:
# kldstat
Id Refs Address Size Name
1 4 0xc0100000 1c1678 kernel
2 1 0xc0a9e000 6000 linprocfs.ko
3 1 0xc0ad7000 2000 warp_saver.ko
4 1 0xc0adc000 11000 linux.ko
如果您正調(diào)試內(nèi)核崩潰轉(zhuǎn)存數(shù)據(jù), 則需要訪問 linker_files 表, 從 linker_files->tqh_first 開始, 并沿 link.tqe_next 指針尋找包含您所查找的 filename 的項(xiàng)。 那個(gè)項(xiàng)的 address 成員就是模塊的加載地址。
接下來, 您需要找出模塊中代碼節(jié) (text section) 的偏移量:
# objdump --section-headers /sys/modules/linux/linux.ko | grep text
3 .rel.text 000016e0 000038e0 000038e0 000038e0 2**2
10 .text 00007f34 000062d0 000062d0 000062d0 2**2
您需要的是 .text 節(jié), 在前述例子中, 是 10 號(hào)節(jié)。第四個(gè)十六進(jìn)制字段 (或者說從左往右數(shù)第六個(gè)字段) 是代碼節(jié)在文件中的偏移量。將這一偏移量與模塊的加載地址相加, 就可以得到模塊的代碼在重定位之后的地址了。在我們的例子中, 可以得到 0xc0adc000 + 0x62d0 = 0xc0ae22d0。 接下來就可以用 add-symbol-file 來告訴 GDB 關(guān)于調(diào)試模塊的信息:
(kgdb) add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0
add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
(y or n) y
Reading symbols from /sys/modules/linux/linux.ko...done.
(kgdb)
歡迎光臨 Chinaunix (http://www.72891.cn/) | Powered by Discuz! X3.2 |