To be a better coder
分类: LINUX
2021-09-06 18:25:07
最近开始阅读libvirt源码,并且使用gdb跟踪源码运行,在此记录:
1. libvirt 源码下载和解压:
所有的源文件放在 libvirt-4.0.0/source 下
2. 编译和运行libvirt, 注意编译的时候要加上--enable-debug=yes 参考文章(未写)
3. 查看libvirt运行,并用gdb监控libvirtd
接下来就可以进行debug了。
gdb 的功能还是很强大的,具体使用网络上有很多教程,这里附上一个我觉得写的最好的,
里面有关于watchpoint , breakpoint 和gdb的相关使用技巧等,这里就不复述了,用空的话将来可以把这个文章翻译过来。
4. debug实例
这里给出一个例子,为了追踪 “virsh domhostname”查询无法获得虚拟机hostname的原因。
会出现virDomainGetHostname 无法支持,但是具体不支持的原因没有在log文件中显示,在gdb中设置断点
再在另外一个terminal中输入virsh domhostname centos, 这时候不会有任何输出,需要在gdb中让libvirt继续运行。回到gdb所在terminal中,让libvirt继续运行,当运行到方法virDomainGetHostname时,运行会中断继续调用逐行调试,并且查看变量变化,跟踪到导致错误的变量。
这里触发了virReportUnsupportedError()的错误,查看conn->driver->domainGetHostname的值
这个函数指针还保持在初始化状态。继续输出conn->driver的值,了解到这里调用的是qemu_driver.
回到代码中,发现domainGetHostname这个方法指针只在remote_driver.c 和openvc_driver.c中有初始化
Openvz_driver.c (openvz): .domainGetHostname = openvzDomainGetHostname, /* 0.10.0 */
Remote_driver.c (remote): .domainGetHostname = remoteDomainGetHostname, /* 0.10.0 */
没有在qemu_driver.c中定义,所以这个方法不支持用qemu启动的虚拟机。