Linux调试之(二)gdb+vmlinux

文章目录

  • 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            /* enable the skud flash and torch by gpio leds driver */
 1851             platform_device_register(&gpio_flash_skud);
 1852        } else if (machine_is_msm8625q_skue()){
1853            /* enable the skue flashlight by gpio leds driver */
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

你可能感兴趣的:(LINUX,内核驱动)