水莹儿 发表于 2019-1-19 09:20:30

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发送时,信息如下:
  # 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 : 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,我的配置文件修改后,如下:
  # 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
  #00xb7f2a410 in __kernel_vsyscall ()
  #10x005b88c1 in select () from /lib/libc.so.6
  #20x08093e2b in zbx_tcp_accept (s=0xbfd8b90c) at comms.c:971
  #30x08064eeb in main_trapper_loop (p=1 '\001', s=0xbfd8b90c) at trapper.c:437
  #40x08055d02 in MAIN_ZABBIX_ENTRY () at server.c:645
  #50x0808803b in daemon_start (allow_root=0) at daemon.c:252
  #60x080551a6 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界面上一致;
  注意了这几点,基本上就没问题了。

页: [1]
查看完整版本: gdb 调试zabbix_server解决zabbix_sender不成功的问题