惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
U
Unit 42
T
Tailwind CSS Blog
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
博客园_首页
云风的 BLOG
云风的 BLOG
博客园 - Franky
D
DataBreaches.Net
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
Cisco Talos Blog
Cisco Talos Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Blog — PlanetScale
Blog — PlanetScale
Know Your Adversary
Know Your Adversary
宝玉的分享
宝玉的分享
V
Visual Studio Blog
AWS News Blog
AWS News Blog
NISL@THU
NISL@THU
I
Intezer
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Privacy International News Feed
T
Tor Project blog
S
Securelist
Microsoft Security Blog
Microsoft Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Recorded Future
Recorded Future
C
Cisco Blogs
P
Palo Alto Networks Blog
Hacker News: Ask HN
Hacker News: Ask HN
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Commits to openclaw:main
Recent Commits to openclaw:main
月光博客
月光博客
T
Threat Research - Cisco Blogs
N
News and Events Feed by Topic
AI
AI
Cyberwarzone
Cyberwarzone
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
MongoDB | Blog
MongoDB | Blog
Microsoft Azure Blog
Microsoft Azure Blog
Scott Helme
Scott Helme
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Martin Fowler
Martin Fowler
量子位
L
LINUX DO - 热门话题
H
Heimdal Security Blog
GbyAI
GbyAI
P
Privacy & Cybersecurity Law Blog
博客园 - 【当耐特】

博客园 - PKICA

博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 rust线程-std::thread::park和unpark 配合Builder实现轻量级的线程挂起与唤醒 rust自定义线程属性std::thread::Builder rust线程 rust关联函数 rust高并发设计实践进阶 rust高并发设计实践 rust性能优化与安全边界 联合体union在rust和C语言中有什么区别 rust并发与异步编程 如何预防rust不良的代码设计总结 rust类型系统与零成本抽象 rust内存模型 告别大显存依赖!用 Rust 新一代深度学习框架 Burn 打造纯 CPU 文本分类推理引擎 rust类型系统标记 编译配置解答 git实用命令 rust底层设计理念值得注意的几个地方总结 rust可变引用作为函数参数的机理详解 Rust内存重解释transmute C与Rust类型映射 Rust FFI 安全抽象范式 rust延迟初始化原语 rust重借用机制与原理 rust参数传递模型 汇编语言语法详解 gdb汇编调试 gdb-pwndbg的安装与使用指南 gdb调试插件gef C语言thread_local linux系统readelf命令使用指南 gdb查看命令 RGB与YUV颜色编码的区别 Rust原子类型 C++ STL求两个集合交集差集 gdb调试集锦 ubuntu24.0.4使用root用户登录 ubuntu24.0.4输入密码后跳回登录界面 AI内存压缩技术TurboQuant及存疑 ubuntu切换到指定内核版本 在没有顶级科技大佬直接背书的情况下deepseek为啥能够异军突起? HuggingFace和deepseek的关系 当前主流AI大模型 Rust写时克隆Cow系列2
gcore转储进程内存
PKICA · 2026-04-13 · via 博客园 - PKICA

gcore 是 GDB 套件中的一个实用工具,用于在不停止或崩溃程序的情况下,为正在运行的进程生成内存快照(Core Dump)。这在调试线上“卡死”或难以复现的逻辑问题时非常高效。 

1. 基本用法

在终端中直接运行,最简单的语法如下:

  • PID: 目标进程的进程 ID。
  • 结果: 默认在当前目录下生成名为 core.<PID> 的文件。

2. 常用参数 

参数说明示例
-o <filename> 指定输出文件的前缀或完整名称。 gcore -o my_dump 1234
-a 转储所有内存映射(包括通常被排除的部分)。 gcore -a 1234
-d <dir> 指定运行 GDB 时使用的目录。 gcore -d /tmp 1234

3. 操作流程

  • 获取 PID: 使用 ps -ef | grep 程序名pidof 程序名 找到目标进程 ID。
  • 生成快照: 执行 gcore <PID>。此时进程会短暂暂停,待文件写入磁盘后恢复运行。
  • 使用 GDB 分析:
    gdb <可执行程序路径> <生成的core文件>
    
    进入 GDB 后,可以使用 bt 查看调用栈,或使用 info threads 查看所有线程状态。

4. GDB 内部替代命令

如果你已经在使用 GDB 调试(attach)某个进程,可以直接在 GDB 提示符下输入:

(gdb) generate-core-file [文件名]
# 或者简写
(gdb) gcore [文件名]

这与外部的 gcore 工具效果一致。

5. gcore主要用途

传统的 Core Dump 是程序崩溃时的“验尸报告”,而 gcore 生成的是“活体切片”。

它的主要用途可以概括为以下四个核心场景:

1). 诊断“程序卡死”(Deadlock / Hang)

这是 gcore 最经典的使用场景。当程序没有崩溃,但不再响应请求(比如死锁、无限循环、等待信号量)时:

  • 你不能等到它崩溃(因为它可能永远卡在那)。
  • 你可以用 gcore <pid> 拍个快照,然后把这个快照拉回本地环境,用 thread apply all bt 查看所有线程的调用栈,找出到底是哪个锁导致了卡死。

2). 线上环境的“非破坏性”采样

在线上(Production)环境直接用 GDB 挂载(attach)进行交互式调试是非常危险的,因为 GDB 会暂停(Stop)进程。

  • gcore 的执行速度非常快(主要是磁盘 I/O 时间)。
  • 生成快照后,你可以立即分离(detach)并让程序恢复运行。
  • 这样你就可以在不影响业务运行的前提下,把包含程序完整状态(内存数据、全局变量、堆栈)的文件带离现场,在离线环境下慢慢分析。

3). 捕捉“中间状态”或内存泄漏

当你怀疑程序运行到某个阶段逻辑有问题,或者发现内存占用异常上升时:

  • 对比分析:在时间点 A 生成一个 core 文件,在时间点 B 再生成一个。
  • 通过对比两个快照中的全局变量、堆分配情况,可以有效定位内存泄漏或状态机逻辑错误。

4). 容错与“时光倒流”

在进行一些可能破坏程序状态的危险 GDB 操作(比如手动调用 call 改变变量值)之前,先执行 gcore

  • 如果你的手动干预导致程序跑飞了或崩溃了,你手头还有一个完整的、干预前的现场备份。

总结:它和传统 Core Dump 的本质区别

  • 传统 Core Dump:是被动触发的,用于回答 “程序是怎么死的?”
  • gcore:是主动触发的,用于回答 “程序现在在干什么?” 或 “程序的内存里现在装了什么?”

6. 注意事项

  • 磁盘空间: Core 文件是进程内存的完整镜像,如果进程占用内存很大(如数 GB),生成的文件也会同样大,请确保目标磁盘空间充足。
  • 权限: 通常需要 root 权限或与目标进程相同的用户权限才能执行转储。
  • ptrace 限制: 某些系统可能会限制 ptrace 调用(如设置了 /proc/sys/kernel/yama/ptrace_scope),导致 gcore 失败,此时可能需要调整内核参数。

参考资料:

[0] gdb调试线程