文章目录
- Linux调试之(二)gdb+vmlinux
- 【1】定位arm-eabi-gdb 和 vmlinux
- 【2】gdb加载内核符号表
- 1.查看内核符号表
- 2.执行arm-eabi-gdb vmlinux
- 3.输入 list*(函数名+函数内偏移) 即可查看特定位置的代码,定位问题。
- 【3】gdb调试基本命令
Linux调试之(二)gdb+vmlinux
运行linux内核,难免会遇到oops崩溃问题,如类似空指针crash,系统crash时会打印一些当时的栈信息,我们可以通过这些信息结合vmlinux来调试具体在哪个函数上出现了问题。gdb可以运行代码进行调试,可以看到更多的panic附近的信息,但对于偶发的panic就不起作用了
本平台为RK3399:
【1】定位arm-eabi-gdb 和 vmlinux
find ./ -type f -name '*' | xargs grep 'arm-eabi-gdb'
find ./ -type f -name '*' | xargs grep 'vmlinux'
【2】gdb加载内核符号表
1.查看内核符号表
Vmlinux是一个elf内核符号表,编译进内核的函数列表之类的可以从里面提取出来
readelf -a vmlinux
访问elf文件所在目录,执行“readelf -a 文件名”即可查看elf文件的内容。
-a选项表示显示所有信息。
2.执行arm-eabi-gdb vmlinux
记得需在内核的.config里面要打开 DEBUG_INFO和DEBUG_VM
./prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-gdb kernel/vmlinux
3.输入 list*(函数名+函数内偏移) 即可查看特定位置的代码,定位问题。
lst*dwc3_send_gadget_ep_cmd+0x108/0x3a8
[09:33:ed+0x24/0x28
(gdb) l * qrd7627a_add_io_devices+0x100
0xc07cd05c is in qrd7627a_add_io_devices (/home/yejialong/GH700C/kernel/arch/arm/mach-msm/msm8x25/goso-msm7627a-io.c:1851).
1846 } else if (machine_is_msm8625q_skud() || machine_is_msm8625q_evbd()) {
1847 #ifndef CONFIG_CALA02
1848 platform_device_register(&pmic_mpp_leds_pdev_skud);
1849 #endif
1850
1851 platform_device_register(&gpio_flash_skud);
1852 } else if (machine_is_msm8625q_skue()){
1853
1854 platform_device_register(&gpio_flash_skue);
1855 }
【3】gdb调试基本命令
https://www.cnblogs.com/yjf512/p/9204520.html
启动项目并断点
start
打临时断点
tb
打断点
b
列出代码
l
单步运行
n
进入函数调试
step
跳出函数
finish
继续运行
c
查看断点信息
info b
去掉某个断点
delete
fork的时候进入子进程
set follow-fork-mode child
fork的时候进入父进程
set follow-fork-mode parent
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)