Linux怎么查看进程消耗的堆栈内存 Linux下gdb分析进程详解

冬磊姑娘_8723

冬磊姑娘_8723

2026-04-27

553人浏览

原创

直接查看 /proc/[pid]/status 中的 vmstk 字段可获进程栈大小(单位kb),该值为内核分配的栈段虚拟内存上限,非实时使用量;ps 和 top 不提供栈信息,其 %mem 和 rss 反映整体物理内存占用。

linux怎么查看进程消耗的堆栈内存 linux下gdb分析进程详解

查进程栈大小直接看 /proc/[pid]/status 的 VmStk

Linux 进程的栈内存大小(不是运行时动态增长的部分,而是内核为该进程分配的栈空间上限)就记录在 /proc/[pid]/status 里,字段叫 VmStk,单位是 KB。它反映的是当前栈段(stack segment)的虚拟内存占用,不等于实际使用的栈深度,但能快速判断是否异常膨胀。

常见错误是误用 ps 或 top 查栈 —— 它们压根不提供栈信息,%MEM 和 RSS 是整个进程的物理内存占用,混在一起看会误导判断。

  • 先拿到 PID:pidof nginx 或 pgrep -f "python server.py"
  • 再读状态:grep VmStk /proc/1234/status → 输出类似 VmStk: 136 kB
  • 注意:这个值通常固定(如 8MB),除非程序显式调用 setrlimit(RLIMIT_STACK, ...) 修改过栈限制

用 pstack 看线程实时调用栈,但得确认它支持当前架构

pstack [pid] 本质是 gdb --batch -ex 'thread apply all bt' -p [pid] 的封装,适合快速抓取所有线程的函数调用链。但它有硬性限制:只支持与当前系统 ABI 匹配的二进制格式。

典型报错 only 32 bit objects supported 就是因为你在 64 位系统上对一个 32 位进程执行 pstack(或反过来)。Ubuntu 默认仓库的 pstack 往往只编译了单一架构版本。

  • 先验证兼容性:file /proc/[pid]/exe 看是 ELF 64-bit 还是 32-bit
  • 若不匹配,改用等效 gdb 命令:gdb -p [pid] -ex 'thread apply all bt' -ex quit 2>/dev/null | grep -v "No symbol"
  • 注意:目标进程需未被 ptrace 阻止(即没设 ptrace_scope=2),否则 gdb 会失败

用 gdb 附加运行中进程看栈帧细节,但必须带调试符号

想看到变量名、源码行号、局部变量值?光有进程不行,得确保它编译时加了 -g。Release 版本的二进制即使能 attach,bt 只显示 ???,info registers 也看不出上下文。

Linux Ai Server
Linux Ai Server

Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。

下载

调试符号不是可选插件,是解析栈帧的必要条件。没有它,gdb 只能做地址级反汇编,无法映射回逻辑结构。

  • 检查是否有符号:readelf -S /path/to/binary | grep debug 或 file binary 看是否含 with debug_info
  • attach 命令:gdb -p [pid],然后 bt full 查完整栈帧 + 寄存器 + 局部变量
  • 关键限制:若进程已 fork() 出子进程,gdb 默认只跟踪原进程;要跟子进程,得提前设 set follow-fork-mode child

/proc/[pid]/maps 里定位堆和栈的内存区间

栈和堆在虚拟地址空间里是真实存在的连续区域,/proc/[pid]/maps 能告诉你它们在哪、多大、有没有执行权限。这对排查栈溢出、堆碎片、mmap 冲突特别有用。

栈段通常出现在 maps 最顶部(高地址),标记为 [stack] 或 [stack:1234];堆段则是匿名映射、从低地址向上长,开头常带 heap 字样或无名 0000000000000000 行。

  • 快速过滤栈:awk '/\[stack\]/ {print $1,$5}' /proc/[pid]/maps → 得到地址范围和权限(如 7ffea3b9e000-7ffea3bbf000 rw)
  • 算栈大小:printf "0x7ffea3bbf000 - 0x7ffea3b9e000 = %d KB\n" $((0x7ffea3bbf000 - 0x7ffea3b9e000))
  • 注意:VmStk 是内核视角的栈段大小,而 maps 里看到的是当前已映射的页范围 —— 两者可能不等,尤其当栈还没涨到上限时

栈的真实大小不靠猜,也不靠 top;它藏在 proc 文件系统里,也暴露在 maps 的地址段中。真正容易被跳过的,是调试符号这个前提 —— 没 -g,gdb 再熟也白搭。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5647

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2448

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5647

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2448

6

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4050

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3453

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2633

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6410

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

6042

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习