当前位置: 首页 > news >正文

angie未生成coredump文件

背景

最近使用angie测试某项功能时,发现其worker进程崩溃了。为了分析崩溃原因,尝试生成coredump文件,但一直未能成功。经过努力,问题最终得以解决,并记录了整个过程。

angie简介

Angie 是基于 Nginx 分支开发的 Web 服务器,旨在成为 Nginx 的直接替代方案。该项目由前 Nginx 核心开发团队主导开发,致力于在保持 Nginx 优势的同时,进一步扩展和增强其功能特性。

环境

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.5 LTS
Release:	22.04
Codename:	jammy
$ /opt/angie/sbin/angie -v
Angie version: Angie/1.10.0

准备工作

设置coredump路径以及格式

$ sudo sh -c 'echo "/var/core/core-%e-%p-%t" > /proc/sys/kernel/core_pattern'$ sudo mkdir /var/core
$ sudo chmod 777 /var/core

开启coredump

$ ulimit -c unlimited

结果

当再次崩溃时,并未在/var/core目录下生成coredump文件
而且

  • 目标目录/var/core权限正常
  • 系统coredump已经开启

简单测试

$ echo -e '#include <stdio.h>\nint main(){*(int*)0=0;return 0;}' > test.c
$ gcc test.c -o test
$ ./test 
段错误 (核心已转储)
$ ls /var/core/
core-test-274547-1760058337

说明系统能正常生成coredump文件,配置正常。

解决

只能是angie自身问题,查询得知angie本身也有coredump相关配置项

worker_rlimit_core 1000m;

增加此项后,最终生成coredump文件

$ ls /var/core/
core-angie-18048-1759988306

源码分析

配置项:
src/core/nginx.c

static ngx_command_t  ngx_core_commands[] = {
...{ ngx_string("worker_rlimit_core"),NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,ngx_conf_set_off_slot,0,offsetof(ngx_core_conf_t, rlimit_core),NULL },
...
};

初始值:

static void *
ngx_core_module_create_conf(ngx_cycle_t *cycle)
{ngx_core_conf_t  *ccf;ccf = ngx_pcalloc(cycle->pool, sizeof(ngx_core_conf_t));if (ccf == NULL) {return NULL;}...ccf->rlimit_core = NGX_CONF_UNSET;	...

设置coredump:
src/os/unix/ngx_process_cycle.c

static void
ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)
{...if (ccf->rlimit_core != NGX_CONF_UNSET) {rlmt.rlim_cur = (rlim_t) ccf->rlimit_core;rlmt.rlim_max = (rlim_t) ccf->rlimit_core;if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,"setrlimit(RLIMIT_CORE, %O) failed",ccf->rlimit_core);}}    ...
}

从源码实现可以看出,默认未配置worker_rlimit_core参数时,不会设置core限制,则此时默认值是从master中继承而来。
而master则是从系统中获取到的。

在当前终端执行了ulimit -c unlimited后,再启动的angie,按理说angie从当前终端能继承到core unlimited的设置,
但是从结果来看

$ ps aux | grep angie
root      275105  0.0  0.0  17512  4352 pts/1    S+   09:27   0:00 sudo /opt/angie/sbin/angie -c /etc/angie/angie.conf
root      275106  0.0  0.0  17512  2096 pts/2    Ss   09:27   0:00 sudo /opt/angie/sbin/angie -c /etc/angie/angie.conf
root      275107  0.0  0.0  10524  5376 pts/2    S+   09:27   0:00 angie: master process v1.10.0 #1 [/opt/angie/sbin/angie -c /etc/angie/angie.conf]
root      275194  0.0  0.4  37980 30220 pts/2    S+   09:27   0:00 angie: worker process #1
$ cat /proc/275194/limits
Limit                     Soft Limit           Hard Limit           Units     
... 
Max core file size        0                    0                    bytes     
...$ cat /proc/275107/limits
Limit                     Soft Limit           Hard Limit           Units     
... 
Max core file size        0                    0                    bytes  
...$ cat /proc/275106/limits
Limit                     Soft Limit           Hard Limit           Units     
...
Max core file size        0                    unlimited            bytes   
...$ cat /proc/275105/limits
Limit                     Soft Limit           Hard Limit           Units     
...  
Max core file size        0                    unlimited            bytes     
...

从进程中的limit可以看到soft limit为0,因此最终进程并不会产生coredump文件。

根据执行的命令行sudo /opt/angie/sbin/angie -c /etc/angie/angie.conf看到,命令是 通过sudo进行启动的angie, 此时sudo已经切换到root权限,没有继承当前终端会话中的设置。

尝试切换到root后,设置ulimit -c unlimited同时不配置worker_rlimit_core

$ su root
# ulimit -c
0
# ulimit -c unlimited
# /opt/angie/sbin/angie -c /etc/angie/angie.conf
$ head /etc/angie/angie.conf
#user  angie;
user  root;
#worker_processes  auto;
worker_processes  1;
worker_rlimit_nofile 65536;
#worker_rlimit_core 1000m;$ ps aux | grep angie
root      275802  0.0  0.0  10520  5376 pts/1    S+   10:01   0:00 angie: master process v1.10.0 #1 [/opt/angie/sbin/angie -c /etc/angie/angie.conf]
root      275803  0.0  0.4  37976 30216 pts/1    S+   10:01   0:00 angie: worker process #1$ cat /proc/275803/limits
Limit                     Soft Limit           Hard Limit           Units     
...  
Max core file size        unlimited            unlimited            bytes     
...

手动触发崩溃

$ ls /var/core/$ sudo kill -11 275803$ ls /var/core/
core-angie-275803-1760061907

结果能生成coredump文件

总结

  • 未配置worker_rlimit_core时,angie是否产生core文件依赖master从当前环境中继承到的设置
  • 当使用sudo时,会切换到root,此时不会继承之前用户终端会话中core的设置
http://www.dtcms.com/a/477661.html

相关文章:

  • 【leetcode刷题007】leetcode116、117
  • 南昌网站推广¥做下拉去118cr如何做实验室网站
  • 从0开始搭建Vue3项目
  • 【知识】Linux将多条指令合并为一条执行
  • 将 MapReduce 程序打成 JAR 包并在 Linux 虚拟机的 Hadoop 集群上运行
  • 06_Miniconda零基础安装配置指南:打造高效的Python开发环境
  • 量子计算与AI融合:材料科学新突破!!
  • 徐州网站建设方案咨询外贸牛
  • 顶级 AI 模型横评:智能、性能与价格等方面全面对比
  • Vuex 详细用法(Vue2 和 Vue3)
  • 注册公司网站如何注册黑龙江公共资源交易网官网
  • 如何将iPhone上的HEIF图像下载到电脑
  • 欧洲宇航局使用Varjo XR头戴设备为宇航员提供虚拟现实空间站任务训练
  • iphone IOS3~IOS9游戏 旧iphone 单机游戏合集分享
  • 昂瑞微冲刺科创板:硬科技与资本市场的双向奔赴
  • 从入门到精通【Redis】Redis 典型应⽤ --- 缓存 (cache)
  • 【深入理解计算机网络10】UDP协议详解
  • 宁波网站建设模板制作什么叫优化
  • 自动裁剪图(电商使用)
  • 大模型应用开发
  • 第15题 三数之和
  • 【1015】计算并联电阻的阻值
  • 红黑树实现与原理剖析(上篇):核心规则与插入平衡逻辑
  • 【AES加密专题】8.实战-测试加密网站和代码
  • 收费的电影网站怎么做可以打开任何网站的软件
  • 设计广告网站wordpress怎么换空间
  • React 18并发模式解析:Fiber架构与性能优化技巧
  • 火山引擎多媒体实验室画质理解大模型Q-Insight入选NeurIPS 2025 Spotlight
  • 【StarRocks】-- DATETIME 与 TIMESTAMP 区别详解
  • k8s nginx ingress介绍