FreeSWITCH线上一次Crashes分析定位过程-ldns库问题

简介: 线上一次Crashes分析定位过程-ldns库问题

FS线上一次Crashes分析定位过程-ldns库问题

– by yine 2018-04-10 15:33:05

\

一、故障发生时间点

2018-04-10 09:54:07

\

二、堆栈查看结果

warning: .dynamic section for "/usr/lib/x86_64-linux-gnu/librtmp.so.1" is not at the expected address (wrong library or version mismatch?)
\
warning: .dynamic section for "/usr/lib/libldns.so.1" is not at the expected address (wrong library or version mismatch?)
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `/usr/bin/freeswitch -nc -nonat -nosql -u popo -g netease'.
Program terminated with signal SIGABRT, Aborted.
#0  0x00007f2388bc9067 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt full
#0  0x00007f2388bc9067 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
        resultvar = 0
        pid = 28593
        selftid = 20809
#1  0x00007f2388bca448 in __GI_abort () at abort.c:89
        save_stage = 2
        act = {__sigaction_handler = {sa_handler = 0x3030303030207078, sa_sigaction = 0x3030303030207078}, sa_mask = {__val = {3475143045726351408, 2314885530819502128, 2314885530818453536, 8319937555149627424, 746872325959545721, 
              3775530756625032759, 3631650816742404144, 3472329422401517619, 3467895374536122416, 2319406791620833328, 3761104034442405222, 2314885530819704883, 2314885530818453536, 2314885530818453536, 4069054363051241248, 
              139789281265312}}, sa_flags = 65, sa_restorer = 0x7f233a740700}
        sigs = {__val = {32, 0 <repeats 15 times>}}
#2  0x00007f2388c071b4 in __libc_message (do_abort=do_abort@entry=2, fmt=fmt@entry=0x7f2388cf9cb3 "*** %s ***: %s terminated\n") at ../sysdeps/posix/libc_fatal.c:175
        ap = {{gp_offset = 32, fp_offset = 32547, overflow_arg_area = 0x7f233a740710, reg_save_area = 0x7f233a7406a0}}
        fd = 2
        on_2 = 
        list = 
        nlist = 
        cp = 
        written = 
#3  0x00007f2388c8caa7 in __GI___fortify_fail (msg=msg@entry=0x7f2388cf9c4a "buffer overflow detected") at fortify_fail.c:31
No locals.
#4  0x00007f2388c8acc0 in __GI___chk_fail () at chk_fail.c:28
No locals.
#5  0x00007f2388c8ca17 in __fdelt_chk (d=) at fdelt_chk.c:25
No locals.
#6  0x00007f23822184c5 in ?? () from /usr/lib/libldns.so.1
No symbol table info available.
#7  0x0000000000000000 in ?? ()
No symbol table info available.
(gdb)

三、FS日志查看结果

popo@hzadg-ysf-01:~/DATA/logs/freeswitch$ grep "8e660ca2-d28a-4f09-a6f7-260bd25b75f4" freeswitch.log

8e660ca2-d28a-4f09-a6f7-260bd25b75f4 2018-04-10 09:54:10.237472 [NOTICE] switch_channel.c:1104 New Channel sofia/internal/test@59.111.165.135:53 [8e660ca2-d28a-4f09-a6f7-260bd25b75f4]

8e660ca2-d28a-4f09-a6f7-260bd25b75f4 2018-04-10 09:54:10.357473 [INFO] mod_dialplan_xml.c:637 Processing test ->test in context default

8e660ca2-d28a-4f09-a6f7-260bd25b75f4 2018-04-10 09:54:10.377454 [NOTICE] switch_ivr.c:2172 Transfer sofia/internal/test@59.111.165.135:53 to enum[test@default]

popo@hzadg-ysf-01:~/DATA/logs/freeswitch$


四、问题定位

通过堆栈可以看出libldns库,通过fs中的日志可以看到最后执行的一行是:mod_enum这个模块下的enum指令后才crash,开始进行漫天的search,终于发现一些端倪;

\

首先发现有人在FS中报了这样一个jira单子:freeswitch.org/jira/browse…

\

FS作者向ldns库作者提了这样一个问题:www.nlnetlabs.nl/bugs-script…

\

ldns作者做了这样一个patch: www.nlnetlabs.nl/bugs-script…

\

五、问题解决

接作者所说增加宏定义,FD_SETSIZE 自己想要扩展的值

From your back trace I see that the crash happens in ldns_sock_wait which uses select to wait for a socket to become readable or writable. The maximum number of sockets fed to select is FD_SETSIZE which is 1024 by default. In the issue report I read that this crash only occurs when the number of file descriptors in use is more than 1024.

\

直接升级debian8上的ldns库至1.7.0版本解决问题

git.nlnetlabs.nl/ldns/tree/C… 中的bugfix #678: Use poll i.s.o. select to support > 1024 fds 这一条即是对本BUG的修复内容

\

但是1.7.0在debian8的发行版本里没有,最新的也只有1.6.18,所以只能自己编译依赖

\

先进入/usr/lib/freeswitch/mod目录下查看mod_enum.so对ldns的依赖, /usr/lib/freeswitch/mod# ldd mod_enum.so

   linux-vdso.so.1 (0x00007ffde5fc5000)

   libldns.so.1 => /usr/lib/libldns.so.1 (0x00007f1c4e9f6000)

可以看到,第二项就是对其的依赖。
复制代码

六、系统无污染替换方法

呼叫中心-媒体服务底层依赖模块替换方法


\

\

下载ldns源码

  1. www.linuxfromscratch.org/blfs/view/s…
  2. cd /home/popo/freeswitch/src
  3. wget www.nlnetlabs.nl/downloads/l…
  4. wget www.openssl.org/source/open…

\

\

安装openssl

  1. cd /home/popo/freeswitch/bin && mkdir openssl-1.1.0c && mkdir ldns-1.7.0
  2. 编译openssl高版本:

./config --prefix=/home/popo/freeswitch/bin/openssl-1.1.0c/openssl --openssldir=/home/popo/freeswitch/bin/openssl-1.1.0c/ssl && make && make install

\

\

安装ldns高版本库

  1. tar zxvf ldns-1.7.0.tar.gz && cd ldns-1.7.0
  2. ./configure --prefix=/home/popo/freeswitch/bin/ldns-1.7.0 --with-ssl=/home/popo/freeswitch/bin/openssl-1.1.0c/openssl && make && make install
  3. cd /home/popo/freeswitch/bin/ldns-1.7.0/lib
  4. ln -s libldns.so.2.0.0 libldns.so.1

\

\

配置用户环境变量

  1. cd ~
  2. vim .profile
  3. 打开此文件添加如下:

PATH=/home/popo/freeswitch/bin/openssl-1.1.0c/openssl/bin:$PATH

\

\

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/popo/freeswitch/bin/openssl-1.1.0c/openssl/lib

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/popo/freeswitch/bin/ldns-1.7.0/lib

\

\

export PATH LD_LIBRARY_PATH

\

\

  1. . .profile 使生效
  2. 校验openssl是否生效: openssl version
  3. 查看环境变量是否生效: env

\

\

重启FS使其mod_enum模块所依赖的ldns库生效

  1. sudo /etc/freeswitch restart
  2. ldd /usr/lib/freeswitch/mod/mod_enum.so

\

\

回退方法

  1. 删除环境变量 .profile 中的新增配置项
  2. 重启FS复原库依赖 sudo /etc/freeswitch restart

\

\

over!

相关文章
|
2月前
|
监控 Java 测试技术
精准化测试原理简介
该文探讨了软件测试中的精准化测试问题,通过找不同游戏引出测试覆盖的挑战。文章指出,全面的测试覆盖并不现实,自动化测试虽有帮助但并非银弹,且面临成本和覆盖率局限。接着,文章提出需要“最强大脑”来快速识别代码差异、影响范围及测试覆盖率。为此,它介绍了通过语法分析器和字节码来定位代码差异,利用ASM进行调用链分析,并借助Jacoco进行覆盖率统计。此外,文章强调了增量覆盖率统计和调用链在接口测试中的重要性,同时提醒高覆盖率不代表高质量,测试策略应结合业务逻辑和代码审查。
22 2
WRF模式案例运行初体验--飓风示例全过程记录
本文主要记录一下首次学习WRF并运行官网案例的全过程。
WRF模式案例运行初体验--飓风示例全过程记录
|
9月前
|
Web App开发 Java 开发工具
systrace: 系统级跟踪工具的解析
systrace是Android4.1版本之后推出的,对系统Performance分析的工具,该工具结合Android 内核的数据,最终会生产html文件。 systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况等
|
12月前
|
算法 开发工具 图形学
引擎只是工具,游戏才是目的
嗨!大家好,我是小蚂蚁。 很多朋友都知道我做了一门专门面向新手的游戏开发课程,在这个课程中使用的是微信小游戏制作工具。有不少人问过我,为什么要选用这个工具,而不去使用那些比较成熟的游戏引擎
75 0
|
12月前
|
测试技术
Sonic 开源移动端云真机测试平台 - 用例编写与回放流程实例演示,任务定时执行、图像相似度定位、公共步骤、公共参数、测试套件等(下)
Sonic 开源移动端云真机测试平台 - 用例编写与回放流程实例演示,任务定时执行、图像相似度定位、公共步骤、公共参数、测试套件等(下)
201 0
|
12月前
|
测试技术 数据安全/隐私保护
Sonic 开源移动端云真机测试平台 - 用例编写与回放流程实例演示,任务定时执行、图像相似度定位、公共步骤、公共参数、测试套件等(上)
Sonic 开源移动端云真机测试平台 - 用例编写与回放流程实例演示,任务定时执行、图像相似度定位、公共步骤、公共参数、测试套件等
533 0
|
运维 监控 数据可视化
不改一行代码定位线上性能问题
性能问题。 大致的现象是: 我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。
|
Web App开发 监控 Kubernetes
日志调试不理想?试试分布式追踪优势
日志调试不理想?试试分布式追踪优势
158 0
日志调试不理想?试试分布式追踪优势
|
监控 算法 Java
【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )
【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )
344 0
|
Shell 数据库 Android开发
【Android 性能优化】应用启动优化 ( 阶段总结 | Trace 文件分析及解决方案 | 源码分析梳理 | 设置主题的方案总结 ) ★
【Android 性能优化】应用启动优化 ( 阶段总结 | Trace 文件分析及解决方案 | 源码分析梳理 | 设置主题的方案总结 ) ★
244 0