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

Linux 信号处理:Core vs Term 解析

一、信号core 与 Trem

动作类型缩写含义典型信号
终止 + 核心转储Core进程终止,并生成 core dump 文件SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV
仅终止Term进程直接终止,不生成 core 文件SIGHUP, SIGINT, SIGKILL, SIGTERM, SIGPIPE

二、Core Dump

2.1 什么是 Core Dump?

Core Dump = 核心转储 = 进程内存的"现场快照"

2.2 为什么"没见过" Core 文件?

云服务器上,core dump 功能是被禁止掉的!

2.3 如何开启 Core Dump?

# 1. 查看当前限制 $ ulimit -a | grep core core file size (blocks, -c) 0 # 2. 临时开启(当前 shell 有效) $ ulimit -c unlimited # 不限制大小 $ ulimit -c 40960 # 限制 40960 blocks(约 20MB) # 3. 验证设置 $ ulimit -a | grep core core file size (blocks, -c) 40960 # 4. 永久开启(写入配置文件) $ echo "ulimit -c unlimited" >> ~/.bashrc

生成并分析 Core 文件

# 测试程序:触发除零错误 $ cat > test_sig.c << 'EOF' #include <stdio.h> int main() { int a = 10; int b = 0; int c = a / b; // SIGFPE printf("%d\n", c); return 0; } EOF $ gcc -o test_sig test_sig.c -g # -g 保留调试信息 # 运行,生成 core 文件 $ ./test_sig Floating point exception (core dumped) # 查看生成的 core 文件 $ ls -lh core* -rw------- 1 user user 2.3M Apr 6 10:30 core.1234 # 使用 gdb 分析 $ gdb ./test_sig core.1234 (gdb) bt # 查看调用栈 (gdb) info locals # 查看局部变量 (gdb) list # 查看源代码

三、为什么会核心转储

支持debug !

开启 core dump , 直接运行崩溃 , gdb , core - file core ,直接帮助我们定位到出错行!

#include <iostream> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <functional> #include <vector> #include <cstdio> #include <sys/wait.h> int main() { pid_t id = fork(); if (id == 0) { sleep(2); printf("hello world!\n"); printf("hello world!\n"); printf("hello world!\n"); printf("hello world!\n"); printf("hello world!\n"); int a = 0; a /= 0; printf("go home!\n"); exit(1); } int status = 0; waitpid(id, &status, 0); printf("signal: %d, exit code: %d, core dump: %d\n", (status & 0x7F), (status >> 8) & 0xFF, (status >> 7) & 0x1); return 0; }

总结:

要点一句话总结
Core 是调试工具程序崩溃时的内存快照,用于事后分析
Term 是干净退出外部干预时的正常终止,不保留现场
云服务器默认禁 Core通过ulimit -c 0限制,防止磁盘爆满
Core 文件可能很大与进程 RSS 相当,大进程可能产生 GB 级 core
必须用 -g 编译没有调试信息,gdb 无法定位源代码行
信号编号看低7位status & 0x7F得到终止信号
Core 标志看第8位(status >> 7) & 1表示是否产生 core
http://www.cnnetsun.cn/news/1730244.html

相关文章:

  • 基于 Vue + TS + Ant Design Vue 实现精细化菜单按钮权限授权组件
  • UI UX PRO MAX怎么做
  • TS_lib深度解析:MegaSquirt协议嵌入式串行通信实现
  • VL6180X ToF测距传感器原理与STM32/Arduino双平台实战
  • Arduino嵌入式Google日历客户端:轻量级流式JSON解析
  • 乐视电视S40 Master方案:告别开机广告,解包修改固件与ROOT实战
  • IEEE 802.15.4 主机库:低功耗星型网络协调与安全通信框架
  • OpenClaw浏览器自动化:千问3.5-9B驱动的智能表单填写
  • 3步搞定!ncmdumpGUI让网易云音乐加密文件自由播放
  • C++ 服务端进阶(五)—— Connection + 协程:面向对象的异步模型(工程版完整实现)
  • 从一次炸机事故看懂示波器地线:隔离变压器、差分探头到底怎么选?
  • 嵌入式GUI开发:基于GUILite的万年历实现
  • Python新年倒计时:用代码打造节日氛围的创意实践
  • 计算机毕业设计:Python滴滴出行数据智能分析平台 Django框架 可视化 数据大屏 数据分析 大数据 机器学习 深度学习(建议收藏)✅
  • 解放加密音乐:ncmdump的格式转换革新
  • STM32外设驱动:内存映射与寄存器操作详解
  • 学生党专属方案:OpenClaw+千问3.5-27B自动整理课堂笔记
  • 单片机与手机远距离通信:WiFi与4G方案详解
  • 避坑指南:在Ubuntu 22.04上为Autoware配置Docker与NVIDIA GPU支持(含代理与镜像源配置)
  • TOPMIN库:嵌入式系统中高效追踪N个最小值的轻量级方案
  • Sanitizer工具集:高效检测内存与线程问题的实战指南
  • GLM-4.1V-9B-Base解决复杂网络问题:模拟与协议分析应用
  • C语言memcpy函数原理与优化实践
  • 嵌入式开发面试题解析与实战技巧
  • Linux内核中的命名空间技术详解
  • 安卓开发者必看:解决Google Play服务报错的5种实战方法(附工具推荐)
  • QMK Toolbox:如何用这款开源工具轻松刷写机械键盘固件?
  • NsEmuTools:终极NS模拟器管理解决方案,告别繁琐配置的困扰
  • 云原生应用的可观测性最佳实践
  • 晶振负载电容与谐振电容的快速计算与选型指南