代码调试-使用gdb调试libvirtd

代码调试-使用gdb调试libvirtd

在这里插入图片描述

目的:

​ 想知道libvirtd在执行具体函数时,函数的具体传参以及局部变量信息

一、安装libvirt 8.0.0
#dnf --enablerepo=PowerTools install gcc cmake libxslt-devel
#dnf --enablerepo=PowerTools install meson rpcgen
#dnf install glib2-devel pkgconfig
#dnf install cyrus-sasl-devel gnutls-devel yajl wireshark  libselinux
#dnf install numactl-devel  libpciaccess-devel libselinux-devel systemd-devel readline-devel libnl3-devel libxml2-devel yajl-devel libtirpc-devel
#yum install python3-docutils      #不能通过pip安装
#cd /opt/github/
#git clone -b v8.0.0 https://github.com/libvirt/libvirt.git
#cd libvirt
#meson setup build --prefix=/usr -Dbuildtype=debug -Dsystem=true -Dsasl=enabled -Ddriver_qemu=enabled -Ddriver_libvirtd=enabled -Ddriver_remote=enabled
#ninja -C build
#ninja -C build install 
#echo "/usr/local/lib64" > /etc/ld.so.conf.d/libvirt.conf
#ldconfig
#libvirtd --version
libvirtd (libvirt) 8.0.0
二、调试libvirt

想调试libvirt 输出某函数执行的过程中的详细信息

2.1 启动libvirtd
#libvirtd --listen
# 查找 libvirtd 进程 PID
#pgrep libvirtd

# 附加 GDB(需 root 权限)
#gdb -p <PID>

打断点

#查看已经打的断点
(gdb) info breakpoints
No breakpoints or watchpoints
#在函数virConnectOpen以及src/remote/remote_daemon.c:1234 行,共打了两个断点
(gdb) break virConnectOpen
Breakpoint 4 at 0x7f67a7692430: file ../src/libvirt.c, line 1201.
(gdb) break src/remote/remote_daemon.c:1234
Breakpoint 5 at 0x564467445154: file ../src/remote/remote_daemon.c, line 1235.
#查看已经打的断点
(gdb) info breakpoints
(gdb) info breakpoints  
Num     Type           Disp Enb Address            What
4       breakpoint     keep y   0x00007f67a7692430 in virConnectOpen at ../src/libvirt.c:1201
        breakpoint already hit 5 times
5       breakpoint     keep y   0x0000564467445154 in main at ../src/remote/remote_daemon.c:1235

client 连接测试

#virsh list --all

gdb侧调试

(gdb) continue  #继续执行,进行到下一个断点
Continuing.
[Switching to Thread 0x7f1489576700 (LWP 71662)]

Thread 9 "prio-rpc-libvir" hit Breakpoint 1, virConnectOpen (name=0x7f1464001060 "") at ../src/libvirt.c:1201
1201        virConnectPtr ret = NULL;
(gdb) list #查看当前代码位置
1196     * Returns a pointer to the hypervisor connection or NULL in case of error
1197     */
1198    virConnectPtr
1199    virConnectOpen(const char *name)
1200    {
1201        virConnectPtr ret = NULL;
1202
1203        if (virInitialize() < 0)
1204            return NULL;
1205
(gdb) next #单步执行,走到下一行代码
remoteOpenConn (uri=0x7f1464001060 "", readonly=false, preserveIdentity=false, conn=0x5651d13ddba8) at ../src/remote/remote_daemon_dispatch.c:1826
1826        if (!*conn)
(gdb) list
1821        VIR_DEBUG("Opening driver %s", uri);
1822        if (readonly)
1823            *conn = virConnectOpenReadOnly(uri);
1824        else
1825            *conn = virConnectOpen(uri);
1826        if (!*conn)
1827            goto error;
1828        VIR_DEBUG("Opened driver %p", *conn);
1829
1830        if (preserveIdentity) {
(gdb) print uri  #print 打印当前list下的变量
$3 = 0x7f1464001060 ""
(gdb) print readonly #print 打印当前list下的变量
$4 = false
(gdb) backtrace #输出当前堆栈,看当前在哪一行以及后面还有哪些待执行
#0  0x00005651d0cd73a3 in remoteOpenConn (uri=0x7f1464001060 "", readonly=false, preserveIdentity=false, conn=0x5651d13ddba8) at ../src/remote/remote_daemon_dispatch.c:1826
#1  0x00005651d0cd7a98 in remoteDispatchConnectOpen (server=0x5651d13ea880, client=0x5651d1401070, msg=0x5651d1402660, rerr=0x7f14895758a0, args=0x7f1464001020) at ../src/remote/remote_daemon_dispatch.c:2098
#2  0x00005651d0cb5097 in remoteDispatchConnectOpenHelper (server=0x5651d13ea880, client=0x5651d1401070, msg=0x5651d1402660, rerr=0x7f14895758a0, args=0x7f1464001020, ret=0x0)
    at src/remote/remote_daemon_dispatch_stubs.h:3241
#3  0x00007f149415ebed in virNetServerProgramDispatchCall (prog=0x5651d13f7010, server=0x5651d13ea880, client=0x5651d1401070, msg=0x5651d1402660) at ../src/rpc/virnetserverprogram.c:428
#4  0x00007f149415e772 in virNetServerProgramDispatch (prog=0x5651d13f7010, server=0x5651d13ea880, client=0x5651d1401070, msg=0x5651d1402660) at ../src/rpc/virnetserverprogram.c:302
#5  0x00007f1494165e9d in virNetServerProcessMsg (srv=0x5651d13ea880, client=0x5651d1401070, prog=0x5651d13f7010, msg=0x5651d1402660) at ../src/rpc/virnetserver.c:140
#6  0x00007f1494165f5d in virNetServerHandleJob (jobOpaque=0x5651d1400be0, opaque=0x5651d13ea880) at ../src/rpc/virnetserver.c:160
#7  0x00007f1494058246 in virThreadPoolWorker (opaque=0x5651d13c19d0) at ../src/util/virthreadpool.c:164
#8  0x00007f149405772c in virThreadHelper (data=0x5651d13ebf80) at ../src/util/virthread.c:241
#9  0x00007f1490e7617a in start_thread () at /lib64/libpthread.so.0
#10 0x00007f1492aeedc3 in clone () at /lib64/libc.so.6 #单步执行 ,往下走下一行代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

robin5911

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值