qemu+kernel (2) 單步調(diào)試arm64 linux kernel
pre:
gdb-multiarch
kernel debug:
第一步:qemu啟動(dòng)內(nèi)核并暫停等待(暫停是可選的,如果不調(diào)啟動(dòng),可以去掉),同時(shí)需要建立網(wǎng)絡(luò)端口等待gdb attach;
命令:
qemu-system-aarch64 -machine virt,virtualization=true,gic-version=3 -nographic -m size=1024M -cpu cortex-a72 -smp 2 -kernel /local/mnt2/workspace/lx/talos/lkp10/kernel_platform/out/kernel-qcm6490-qclinux-base/dist/Image -drive format=raw,file=rootfs.img -append "root=/dev/vda rw nokaslr" -s -S
# -s 是-gdb tcp::1234 的簡(jiǎn)寫,如果需要換端口可以用-gdb tcp::1234替換-s參數(shù)
# -S 是freeze cpu at startup的指令,也就是kernel 啟動(dòng)時(shí)就掛起,等待調(diào)試連接,如果不需要調(diào)試內(nèi)核啟動(dòng),這個(gè)參數(shù)也
可以去掉
# nokaslr 關(guān)閉KASLR,它是內(nèi)核啟動(dòng)添加隨機(jī)地址保護(hù)
第二步:?jiǎn)?dòng)gdb(target=arm64)加載對(duì)應(yīng)kernel Image的vmlinux, attach到指定端口即可
gdb-multiarch --tui vmlinux
target remote:1234
第三步:如果是啟動(dòng)是掛起,直接設(shè)置斷點(diǎn)即可調(diào)試
b 函數(shù)名稱:可以在相應(yīng)函數(shù)打斷點(diǎn)
bt看堆棧,可以用frame去看每一層關(guān)系
s和n都是一行一行執(zhí)行代碼:
n:不進(jìn)入函數(shù)內(nèi)部,整個(gè)函數(shù)會(huì)被執(zhí)行
s:進(jìn)入函數(shù)內(nèi)部,一步步觀察
#通信硬件人筆面經(jīng)互助##秋招提前批啟動(dòng)你開沖了嗎##??蛣?chuàng)作賞金賽#