gdb 调试zabbix_server解决zabbix_sender不成功的问题

先说下环境及使用版本:


Red hat Enterprise Linux 64位系统,zabbix 1.8.5


zabbix server端,agent,web等都搞定了,就剩下一个zabbix_sender,死活搞不定。让人郁闷的是,zabbix server debug的log中,什么都没有写,一切似乎都很正常!于是,一怒之下,用gdb调试zabbix_server来看看究竟是怎么回事。


使用zabbix_sender发送时,信息如下:


[root@localhost tmp]# zabbix_sender -k "online_users" -o "456" -T -vv  -c /etc/zabbix/zabbix_agentd.conf  -s iPilot-80 -z 10.10.136.83

zabbix_sender [20644]: DEBUG: answer [{

        "response":"success",

        "info":"Processed 0 Failed 1 Total 1 Seconds spent 0.308953"}]

Info from server: "Processed 0 Failed 1 Total 1 Seconds spent 0.308953"

sent: 1; skipped: 0; total: 1

把zabbix_server的config文件中的debuglevel改成debug,然后在日志中搜索online_users,可以看到有类似下面的日志:


78276-  6460:20111212:220318.043 Trapper got [{

78277-  “request”:”sender data”,

78278-  “data”:[

78279-          {

78280-                  “host”:”iPilot-80″,

78281:                  “key”:”onlines”,

78282-                  “value”:”456″}]}] len 104

78283-  6460:20111212:220318.043 In recv_agenthistory()

78284-  6460:20111212:220318.043 In process_hist_data()

78285-  6460:20111212:220318.043 In process_mass_data()

78286-  6460:20111212:220318.043 In DCinit_nextchecks()

78287-  6460:20111212:220318.043 In DCflush_nextchecks()

78288-  6460:20111212:220318.043 End of process_mass_data()

78289-  6460:20111212:220318.043 In zbx_send_response()

78290-  6460:20111212:220318.043 zbx_send_response() ‘{

78291-  “response”:”success”,

78292-  “info”:”Processed 0 Failed 1 Total 1 Seconds spent -0.000000″}’

78293-  6460:20111212:220318.043 End of zbx_send_response():SUCCEED

78294-  6460:20111212:220318.043 End of recv_agenthistory()


这里,我们可以清晰的看到函数执行时的调用顺序。


ok,gdb出场了。


首先,编译zabbix_server时,在Makefile中,把


zabbix_server_CFLAGS = -DZABBIX_DAEMON


改成


# zabbix_server_CFLAGS =


重新编译,启动编译后的zabbix_server;


然后,使用gdb attach到zabbix_server上;


当你使用ps aux时,你会发现有很多个(通常有20多个)zabbix_server进程在运行,怎么办?


ok,修改zabbix server的配置文件,把Start开始的进程数配置都改成最小,其中,StartTrappers一定要改成1,我的配置文件修改后,如下:


[root@redhat5 tmp]# cat /etc/zabbix/zabbix_server.conf | grep Start | grep -v ^#

StartPollers=0

StartIPMIPollers=0

StartPollersUnreachable=0

StartTrappers=1

StartPingers=0

StartDiscoverers=0

StartHTTPPollers=0

StartDBSyncers=1

StartProxyPollers=0


重启重新编译后的zabbix_server,用gdb ./zabbix_server来调试(假设当前目录的zabbix_server的编译目录)。


ps aux | grep zabbix_server时,一般会有10个左右的zabbix_server进程,这时,一般第3个进程是trapper的进程,如何判断是不是trapper的进程?


当你attch zabbix_server进程pid后,使用bt命令,显示出函数堆栈,trapper的如下:


(gdb) bt

#0  0xb7f2a410 in __kernel_vsyscall ()

#1  0x005b88c1 in select () from /lib/libc.so.6

#2  0x08093e2b in zbx_tcp_accept (s=0xbfd8b90c) at comms.c:971

#3  0x08064eeb in main_trapper_loop (p=1 '\001', s=0xbfd8b90c) at trapper.c:437

#4  0x08055d02 in MAIN_ZABBIX_ENTRY () at server.c:645

#5  0x0808803b in daemon_start (allow_root=0) at daemon.c:252

#6  0x080551a6 in main (argc=16, argv=0x0) at server.c:437

(gdb)


根据上面zabbix server的日志,设置zabbix server的breakpoint:


b process_hist_data


b process_mass_data


当一步一步跟踪下去之后,发现问题出在这个函数身上:


zbx_tcp_check_security


这个函数用来检查zabbix_sender端是否被允许发送数据。


终于搞清楚了,zabbix-sender的文档仅仅说了zabbix_sender的用法,其中,在web界面上,配置zabbix_sender的item时,需要注意:


1、类型一定要是zabbix_trap类型;


2、allowed ip要填写zabbix_sender的ip地址,如果有多个,使用,分割;


3、zabbix_sender命令中的-s参数hostname要和server的web界面上一致;


注意了这几点,基本上就没问题了。




本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1888995,如需转载请自行联系原作者

你可能感兴趣的:(gdb 调试zabbix_server解决zabbix_sender不成功的问题)