1、打开configure,发现CFLAG中都带有-g选项,默认都产生了调试信息。-O2选项可能对产生影响,我们去掉所有CFLAG中的-O2选项。
./configure
查看Makefile,CFLAGS中有-g选项,而且没有-O2选项。
CFLAGS = -g -Dlinux -I/usr/include/rpm
2、设置断点
我们在snmp_agent.c中设置一个断点,可以用下面的方式:
(gdb) b 源文件名:行号
在设置断点的报错:
(gdb) b snmp_agent.c:123
No source file named snmp_agent.c.
查看agent/Makfile,发现net-snmp生成了多个共享库文件(.so文件)。snmpd调用了其中的多个.so文件,而共享库只有当程序运行才开始加载的。
于是可以这么做:
gdb snmpd
(gdb)break main
(gdb)run -f -Lo
然后再设置断点就可以了。
(gdb) b snmp_agent.c:123
Breakpoint 2 at 0xc0ed14: file snmp_agent.c, line 123.
run的时候我们加上了-f和-Lo两个参数,-f表示不fork子进程,即不后台执行,这样我们才能用GDB调试。-Lo表示把Log输出到标准输出上。
我们可以在执行run前后看用info shared看一下加载的共享库。
在run之前:
(gdb) info shared
No shared libraries loaded at this time.
在run之后:
(gdb) info shared
From To Syms Read Shared Object Library
0x009eb4f0 0x00a73784 Yes /usr/local/lib/libnetsnmpmibs.so.10
0x00ee2c58 0x00f06368 Yes /usr/local/lib/libnetsnmpagent.so.10
0x00c435d8 0x00c54b14 Yes /usr/local/lib/libnetsnmphelpers.so.10
0x00f1f8f4 0x00f78230 Yes /usr/local/lib/libnetsnmp.so.10
0x00b70870 0x00baac20 Yes /usr/lib/librpm-4.3.so
0x0027eb40 0x003377ac Yes /usr/lib/librpmdb-4.3.so
0x00392a98 0x0039ea40 Yes /usr/local/lib/libelf.so.1
0x001700e0 0x00178514 Yes /lib/libselinux.so.1
0x00b18ba0 0x00b55954 Yes /usr/lib/librpmio-4.3.so
0x00bd578c 0x00c0b598 Yes /usr/local/lib/libbeecrypt.so.6
0x00ad4bb0 0x00ad58c4 Yes /lib/libdl.so.2
0x00c180d0 0x00c1d66c Yes /lib/tls/librt.so.1
0x00ade2d0 0x00ae67e8 Yes /lib/tls/libpthread.so.0
0x002500c0 0x0025dddc Yes /usr/lib/libbz2.so.1
0x00da6310 0x00daadfc Yes /usr/lib/libpopt.so.0
0x001125b0 0x0011babc Yes /usr/lib/libz.so.1
0x003cbbb0 0x0045dd2c Yes /lib/libcrypto.so.4
0x00124300 0x0013d5a4 Yes /lib/tls/libm.so.6
0x0049ebc0 0x005911a0 Yes /lib/tls/libc.so.6
0x00d15c30 0x00d7e188 Yes /usr/lib/libstdc++.so.6
0x00c2d7e8 0x00c3412c Yes /lib/libgcc_s.so.1
0x009677a0 0x00979a7f Yes /lib/ld-linux.so.2
0x00148cd0 0x00156374 Yes /usr/lib/libgssapi_krb5.so.2
0x0018b860 0x001d9f04 Yes /usr/lib/libkrb5.so.3
0x00deb8ec 0x00debfcc Yes /lib/libcom_err.so.2
0x001e4260 0x001f8fb8 Yes /usr/lib/libk5crypto.so.3
0x00cc53f0 0x00cd0ecc Yes /lib/libresolv.so.2