檢視kernel呼叫棧對應的程式碼行號
我們在分析watchdog問題時經常會遇到D狀態的執行緒,然後它的呼叫棧如下:
"ActivityManager" prio=5 tid=11 Native |
---|
這裡我們能看得出來這裡是卡在了binder_ioctl方法中,但是具體卡在這個方法的什麼地方我們是看不出來的,那麼我們怎麼找到對應的行號呢?
第一步:
下載對應程式碼的symbols,並解壓.我這裡用的是libra_symbols_7.12.8_7.0_99cc23c6f1_g35e222b.tgz,symbols的下載地址在:http://eng.pt.miui.com/?r=eng&dir=/symbols
第二步:
在原始碼目錄下執行gdb可執行檔案:~/AndroidCode/C1-O/prebuilts/gdb/linux-x86/bin$ ./gdb
第三步:
載入vmlinux,vmlinux在symbols中,具體路徑在out/target/product/libra/obj/KERNEL_OBJ/下
file /home/mi/xiaomiwork/LOG/surfaceflinger/C8/培訓/out/target/product/libra/obj/KERNEL_OBJ/vmlinux-35e222b
第四步:
list *binder_ioctl+0x1a8
0xffffffc000a373f4 is in binder_ioctl (/home/work/libra-n-dev-build/kernel/drivers/android/binder.c:437)
第四步結束後我們就能夠得到對應的程式碼行號了,我們可以看下對應的程式碼它卡在了哪裡: