用gdb调试找出nginx崩溃的原因

转载自:http://lutaf.com/140.htm


某年某月某日,一个工程师跑来找我说:很多用户抱怨APP频繁闪退,他觉得server运行正常,找不出原因,请我帮忙

按照流程一路排查下去,发现nginx访问日志里面有大量的http 504 err code

tail -f /var/log/messages

同时出现大量的类似错误信息

nginx[1234]: segfault at 0000000000000008 rip 000000000043edf8 rsp 00007fff34a21fa0 error 4

出现segfault那只能用gdb了,这也是Linux做server的好处了,换成微软平台,无比的麻烦

解决问题分成4步:

  1. 配置系统生成coredump文件,很简单

    ulimit -a

    第一行就是关于core file的设置,默认是不生成coredump文件的,执行 ulimit -c 1024 即可,记得调试完成之后要用ulimit -c 0关闭,不然你的硬盘很快会被填满

  2. gdb调试,需要debug版本的nginx才能定位到源代码,于是需要重新编译一份nginx

    首先把现有的nginx bin目录和conf目录都备份

    然后打印nginx的原始编译选项

    /opt/nginx/sbin/nginx -V

    在这个基础上加上 --with-debug,重新make一份即可

    在${NGINX-SOURCE-DIR}$/objs 目录中找到编译好的nginx ,复制到你的nginx运行目录,切记不要make install ,因为这样会覆盖掉你的nginx.conf文件

  3. 重新运行nginx,等待core.xxx文件生成。一般是在当前目录下生成

  4. 用gdb加载 coredump 文件

    gdb --core=core.xxx

    gdb> where

很容易就找到了nginx segfault的原因:我们自己写的一个nginx modules里面,对某些参数没有做边界检查,但外部环境变化之后,访问空指针了

收尾:

  • ulimit -c 0 :关掉coredump

  • 改完代码之后,重新编译一份不带debug信息的nginx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值