Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3785186
  • 博文数量: 880
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 6155
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-11 09:12
个人简介

To be a better coder

文章分类

全部博文(880)

文章存档

2022年(5)

2021年(60)

2020年(175)

2019年(207)

2018年(210)

2017年(142)

2016年(81)

分类: LINUX

2021-09-06 18:25:07

https://blog.csdn.net/yadehuiyin/article/details/80799267

最近开始阅读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启动的虚拟机。

阅读(1093) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~