首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
PowerPC
» 使用 GDB 和 KVM 调试 Linux 内核与模块-2
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
使用 GDB 和 KVM 调试 Linux 内核与模块-2
发短消息
加为好友
look_w
当前离线
UID
1066743
帖子
8283
精华
0
积分
4142
阅读权限
90
在线时间
233 小时
注册时间
2017-6-23
最后登录
2019-5-18
论坛元老
UID
1066743
1
#
打印
字体大小:
t
T
look_w
发表于 2017-12-19 20:41
|
只看该作者
使用 GDB 和 KVM 调试 Linux 内核与模块-2
创建支持 gdb 调试的 KVM 虚拟机本节介绍如何在 Linux RedHat/CentOS 上创建 KVM 虚拟机,并配置虚机使其运行 gdbserver 以支持 gdb 调试。
如果 KVM 没有安装,首先安装 KVM 及相关软件。安装步骤如下:
KVM 需要有 CPU 的支持(Intel vmx 或 AMD svm),在安装 KVM 之前检查一下 CPU 是否提供了虚拟技术的支持:
1
[root@myKVM ~]# egrep '^flags.*(vmx|svm)' /proc/cpuinfo
若有显示,则说明处理器具有 VT 功能。
在主板 BIOS 中开启 CPU 的 Virtual Technolege(VT,虚化技术 );
安装 kvm 及其需要的软件包。
1
[root@myKVM ~]# yum install kvm kmod-kvm qemu kvm-qemu-img virt-viewer virt-manager libvirt libvirt-python python-virtinst
或
1
[root@myKVM ~]# yum groupinstall KVM
检查 kvm 模块是否安装,使用以下命令显示两个模块则表示安装完成:
1
2
3
4
5
[root@myKVM ~]# lsmod | grep kvm
kvm_intel 52570 0
kvm 314739 1 kvm_intel
启动 virt-manager 管理界面。
客户端:使用 VNC 连接到服务器端,因为需要用服务器的图形界面。
服务器端:启动 libvirtd 服务,并保证下次自动启动:
1
2
3
[root@myKVM ~]# service libvirtd start
Starting libvirtd daemon: [ 确定 ]
[root@myKVM ~]# chkconfig libvirtd on
接下来远程创建和管理 KVM 虚拟机。打开 Application -> System Tools -> Virtual Machine Manager 就可以装虚拟机了,功能跟 VMware 类似。
相关的命令有 virt-manager 和 virsh。
使用“virsh list”可以查看虚拟机是否已经创建,然后通过“virsh edit <vm_name>”可以修改 VM 配置。
根据本文的测试结果,domain type 必须改为 .../qemu/1.0 才能支持 gdb 调试。
1
<domain type='kvm' xmlns:qemu='<a href="http://libvirt.org/schemas/domain/qemu/1.0"><code>
http://libvirt.org/schemas/domain/qemu/1.0<
;/code></a>'>
然后添加下面的配置使得虚拟机支持 gdb 调试:
1
2
3
4
5
<qemu:commandline>
<qemu:arg value='-S'/>
<qemu:arg value='-gdb'/>
<qemu:arg value='tcp::1234'/>
</qemu:commandline>
如果创建好的虚拟机不能访问,可以使用 ping, brctl show, ps 等命令进行诊断,不再一一详述。
使用 gdb 调试 KVM 虚拟机的内核与模块本节介绍如何调试 KVM 虚拟机内核和模块。并说明在调试过程中如何加载模块并链接符号表。
首先将虚拟机更新至编译好的内核。可将 vmlinux , System.map, initramfs, /lib/modules/<kernel version> 这些文件拷贝至虚拟机,或者在虚拟机上重新编译内核。
然后在主机端创建一个目录,拷贝 vmlinux 文件并进入 gdb 调试:
1
gdb vmlinux-3.18.2
图 6. 打开 gdb
连接虚拟机:
1
target remote 127.0.0.1:1234
图 7. 连接虚拟机
此时虚拟机已经被中断。
下面在 load_module 添加断点并继续执行。
图 8. 添加断点并执行
在虚拟机上插入需要调试的模块:
1
insmod nzuta.ko
图 9. 插入模块
在宿主机上找到调用 do_init_module 的地方,添加断点并执行到此处。
图 10. 在 do_init_module 处添加断点并执行
下面是关键的部分。
打印 text section,data section 和 bss section 的名称和地址:
1
2
3
4
5
6
print mod->sect_attrs->attrs[1]->name
print mod->sect_attrs->attrs[7]->name
print mod->sect_attrs->attrs[9]->name
print /x mod->sect_attrs->attrs[1]->address
print /x mod->sect_attrs->attrs[7]->address
print /x mod->sect_attrs->attrs[9]->address
根据上面打印的地址导入编译好的内核模块(注意编译此模块需要使用与虚拟机相同的内核源码编译,也需要使用 -O1 选项):
1
2
add-symbol-file /home/dawei/nzuta/nzuta.ko <text addr> -s .data <data addr> -s .bss
<bss addr>
图 11. 导入编译好的内核模块
下面就可以在模块代码中添加断点并单步调试了:
图 12. 添加断点并单步调试
如果要退出 gdb,需要先使用 delete 命令清理所有断点,并 detach。
总结本节总结 GDB 调试 KVM 虚机内核和模块的方法,并指出其优点和不足。
使用 GDB+KVM 调试内核和模块有几个优势。一是可以进行源码级单步调试,二是对硬件环境的要求比较简单,只需要一台主机即可。 第三是当内核或模块有问题时可以快速重启虚拟机,这一点对内核模块的开发相当重要。这种方法的局限之处在于,当需要调试硬件驱动的时候,如果这种硬件还没有被 KVM 虚拟化支持,则不能调试与此硬件有关的功能,而只能调试仅与内核操作有关的代码。
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
电源与功率管理
综合技术交流
测试测量
MCU 单片机技术
ARM
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议