C 具有共享库符号的GDB回溯

C 具有共享库符号的GDB回溯,c,gdb,net-snmp,C,Gdb,Net Snmp,我正在使用net snmp库调试应用程序崩溃。回溯如下: #0 0x001a1c7e in _snmp_parse (sessp=0x0, session=<value optimized out>, pdu=0xb6183858, data=0xa3401248 "\301", length=12097984) at snmp_api.c:4408 #1 0x001a20bb in snmp_resend_request (slp=0x0, rp=0xb6184818, inc

我正在使用net snmp库调试应用程序崩溃。回溯如下:

#0  0x001a1c7e in _snmp_parse (sessp=0x0, session=<value optimized out>, pdu=0xb6183858, data=0xa3401248 "\301", length=12097984) at snmp_api.c:4408
#1  0x001a20bb in snmp_resend_request (slp=0x0, rp=0xb6184818, incr_retries=1) at snmp_api.c:6383
#2  0x00b89944 in send_trap_to_sess (sess=0xb6122848, template_pdu=0xa3401440) at agent_trap.c:945
#3  0x00b8ab46 in netsnmp_send_traps (trap=-1, specific=-1, enterprise=0xbbd080, enterprise_length=10, vars=0xa5400468, context=0x0, flags=0)
    at agent_trap.c:839
#4  0x00b8b0fa in send_enterprise_trap_vars (trap=-1, specific=-1, enterprise=0xbbd080, enterprise_length=10, vars=0xa5400468) at agent_trap.c:863
#5  0x00b8b153 in send_trap_vars (trap=-1, specific=-1, vars=0xa5400468) at agent_trap.c:975
#6  0x00b8b1fe in send_v2trap (vars=0xa5400468) at agent_trap.c:1049
#7  0x00288382 in applicationBaseClass::sendTraps (temp=0x161d3018) at appBaseClass.cpp:750
#8  0x00288311 in applicationBaseClass::sendTrapsByTimer (temp=0x161d3018) at appBaseClass.cpp:736
#9  0x00ac05f3 in check_timers () at exec_timer.c:383
我们可以看到源文件对应于安装的网络snmp版本-5.5-57

现在,我的应用程序正在链接到网络snmp:

 [root@stg blr]# lsof -p 4043 | grep snmp
serv_trans  4043 root  mem    REG        8,2  1760620     4031 /usr/lib/libnetsnmpmibs.so.20.0.0
serv_trans  4043 root  mem    REG        8,2   701880     4978 /usr/lib/libnetsnmp.so.20.0.0
serv_trans  4043 root  mem    REG        8,2   313568     3982 /usr/lib/libnetsnmpagent.so.20.0.0
serv_trans  4043 root  mem    REG        8,2   157008     4017 /usr/lib/libnetsnmphelpers.so.20.0.0
因此,应用程序正确地链接到5.5-57版的网络snmp库

现在,回到回溯。堆栈似乎不正确。它没有显示确切的调用顺序。例如,在第2帧中,gdb显示的行号-6383-实际上是一个声明语句

#1  0x001a20bb in snmp_resend_request (slp=0x0, rp=0xb6184818, incr_retries=1) at snmp_api.c:6383
6383        u_char         *pktbuf = NULL, *packet = NULL;

我会错过什么?我似乎有正确的gdb源文件。为什么gdb的堆栈跟踪没有指向事件的确切顺序?

frame#2的pc显示为agent#trap.c:945,但该行的源代码(我下载了debuginfo)显示了对snmp#async(异步)send的调用,而不是frame#1中显示的snmp#resend(重新发送)请求函数。我检查了snmp\u async\u send不是宏;这是一个真正的函数。frame#1的pc有些奇怪。可能堆栈已损坏。@马克,谢谢你的评论。对我也有同样的想法。当我们检查代码时,显示的函数调用不正确。
#1  0x001a20bb in snmp_resend_request (slp=0x0, rp=0xb6184818, incr_retries=1) at snmp_api.c:6383
6383        u_char         *pktbuf = NULL, *packet = NULL;