代码调试-使用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 #单步执行 ,往下走下一行代码