“使用KVM辅助内核GDB进行实时调试”的版本间的差异

来自Lustre文件系统
跳转至: 导航搜索
(创建页面,内容为“= 介紹 = 内核远程实时调试功能是非常有用的。基于[https://wiki.whamcloud.com/display/~green Oleg Drokin]的思路,我整理了以下内容,…”)
(没有差异)

2020年8月1日 (六) 02:58的版本

介紹

内核远程实时调试功能是非常有用的。基于Oleg Drokin的思路,我整理了以下内容,作为入门的概述。

指令

  1. 创建一个KVM镜像
  2. 更新KVM的xml文件

    a.

    sudo virsh edit <uuid>
      
    <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
     
     
    ###and at the end add:
     
     
      <qemu:commandline>
        <qemu:arg value='-gdb'/>
        <qemu:arg value='tcp::1200'/> ## 1200 is the TCP port that gdb will connect on
      </qemu:commandline>
    </domain>

    b. 在Ubuntu主机上,"sudo virsh edit"命令似乎无法更新虚拟机的定义。可以使用下面的方法:

    virsh dumpxml test03 > test03.xml
    vi test03.xml # Update it as above
    virsh define test03.xml
    

  3. 抓取vmlinux并解压

    a.

    /boot/vmlinux-2.6.32.431.23.3.el6_lustre.bz2
    
    b. 将vmlinux复制到客户机操作系统上

  4. 客户机使用Centos 7.5及以上版本时,应禁用内核地址空间随机化(Kernel Address Space Randomization,KASLR)功能: 在/etc/default/grub的GRUB_CMDLINE_LINUX行添加"nokaslr",然后确保更改生效。
    grub2-mkconfig -o /boot/grub2/grub.cfg
    

  5. 下载.gdbinit并将其保存在你的主目录中
  6. 将带有调试符号的模块保存在主机上
  7. 启动客户机的操作系统
  8. 在客户机上,加载你想调试的模块:例如lnet.ko
  9. 在主机上,使用vmlinux 启动gdb

    gdb vmlinux-2.6.32.431.23.3.el6_lustre
    
    

    在客户机的GDB中:

    (gdb) target remote localhost:1200
    ## This is defined int he .gdbinit and it will list all the addresses of the loaded modules
    (gdb) mod-list-syms
    add-symbol-file lnet.ko 0xffffffffa03c8000
    add-symbol-file sha512_generic.ko 0xffffffffa00a8000
    add-symbol-file sha256_generic.ko 0xffffffffa0065000
    add-symbol-file crc32c_intel.ko 0xffffffffa0023000
    add-symbol-file libcfs.ko 0xffffffffa0356000
    add-symbol-file fuse.ko 0xffffffffa0231000
    add-symbol-file autofs4.ko 0xffffffffa034e000
    add-symbol-file sunrpc.ko 0xffffffffa02f5000
    add-symbol-file bnx2fc.ko 0xffffffffa02d7000
    ....
    ## Add the symbols to GDB using the module with debugging symbols you copied to your host machine
    (gdb) add-symbol-file /path/to/lnet.ko 0xffffffffa03c8000
    ## Add breakpoints as you wish
    ## continue execution
    (gdb) continue
    

    这时,你要调试的模块的符号已经加载到GDB中,GDB已经连接到你的客户机操作系统。

  10. 添加战略性的断点来加强调试功能
  11. 调用你想调试的场景
  12. GDB将运行到所需的断点处暂停,允许像通常从gdb中调试用户空间程序那样进行调试。