想看一个进程的 堆栈(stack)信息

Ubuntu下程序进程堆栈信息——gstack 分享Ubuntu下根据gstack进行CPU占用较高程序排查 阅读详情
AI摘要

本文介绍了多种查看进程堆栈信息的方法,适用于调试查看堆栈回溯、分析崩溃等不同场景。包括用特定工具查看进程堆栈、快速查看堆栈、查看主线程栈、看系统调用、分析多线程程序堆栈等,还提及了查看栈空间使用情况及实战分析卡住的进程。

想看一个进程的 堆栈(stack)信息,有很多种方法,主要取决于你是想:

  1. 调试查看堆栈回溯(比如看看程序卡在哪)
  2. 分析崩溃 / 死锁 / 阻塞
  3. 查看线程的栈使用情况 / 栈空间地址

下面我分情况给你列出查看进程堆栈的几种常用方法:


🧵 一、用 gdb 查看进程堆栈(最强大)

适合调试或分析运行中的进程。

✅ 步骤:

gdb -p <pid>

然后进入 GDB 命令行:

(gdb) bt

bt(backtrace)会打印出当前进程或主线程的函数调用栈。

👉 也可以查看所有线程:

(gdb) info threads
(gdb) thread <n>
(gdb) bt

退出:quit


🔍 二、用 pstack 快速查看堆栈(简洁)

pstack <pid>

输出类似这样:

#0  0x00007f8c45 in poll () from /lib/libc.so.6
#1  0x00007f8c12 in __libc_start_main () from /lib/libc.so.6
...

每个线程的调用栈都会列出来,很适合快速查看“进程卡在哪里”。


🔎 三、用 cat /proc/<pid>/stack 查看主线程栈(只看一点点)

cat /proc/<pid>/stack

这是 Linux 提供的接口,只显示主线程当前正在执行的内核栈,例如:

[<ffffffff81234567>] futex_wait_queue_me+0xd7/0x140
[<ffffffff81234567>] futex_wait+0x189/0x270
...

适合快速判断:这个进程卡在 futex 等锁了没?


📦 四、用 strace 看系统调用(间接观察栈行为)

strace -p <pid>

虽然 strace 不直接给你堆栈,但你可以看到当前进程卡在哪个系统调用,比如:

futex(0xdeadbeef, FUTEX_WAIT, 1, NULL

你就知道它在睡觉了 😂


🧵 五、分析所有线程堆栈(多线程程序)

用 gdb 或 pstack 都可以查看全部线程:

  • gdb -p <pid> → info threads
  • pstack <pid>(会输出所有线程的栈)
  • cat /proc/<pid>/task/<tid>/stack 可以查看任意线程的内核栈

🔥 实战:假设你想分析一个卡住的进程

  1. 找 PID:
ps aux | grep <your_app>
  1. 看堆栈:
pstack <pid>
  1. 如果你想深入分析:
gdb -p <pid>
# 然后在 GDB 里用 bt 看回溯
  1. 想看哪个线程卡住了,可以在 GDB 用:
info threads
thread <n>
bt

🧠 bonus:查看栈空间使用情况

cat /proc/<pid>/maps | grep stack

输出示例:

7fff5d1c6000-7fff5d1e8000 rw-p 00000000 00:00 0                          [stack]

这告诉你栈的虚拟内存范围,想看使用量可以用 smaps:

cat /proc/<pid>/smaps | grep -A 15 '\[stack\]'

✅ 总结你可以用的命令

命令作用
gdb -p <pid> + bt最详细,调试视角
pstack <pid>快速查看所有线程堆栈
cat /proc/<pid>/stack查看主线程内核栈
strace -p <pid>看是否卡在系统调用
cat /proc/<pid>/maps查看栈地址空间
cat /proc/<pid>/task/<tid>/stack查看指定线程内核栈

如果你能告诉我你是要分析什么样的程序(比如阻塞了?挂死了?死锁了?),我可以一步一步带你排查,还可以帮你写个一键堆栈收集脚本。要不要试试?

【GDB】__stack_chk_fail 栈溢出问题定位 一、问题描述 进程收到SIGABRT信号异常退出,异常调用栈显示__stack_chk_fail 二、原因分析和定位思路 原因分析: __stack_chk_fail说明发生了缓冲区溢出,canary被破坏。这说明代码设置GCC编译选项fstack-protector,开启了栈保护机制canary 定位思路: 先通过反汇编找到canary在栈上的存放地址。 用GDB对canary的存放地址打数据断点,定位出导致栈破坏的指令,再结合C代码具体分析。 三、定位过程 以下给出一个简化案例:一个可执行程序tes 阅读详情

相关推荐

使用/proc信息跟踪进程的堆栈

如果你熟悉Linux的话,就有一个常识,Linux中所有的内存信息(进程)都是以文件形式保存在/proc目录下的,我们获取通过该目录下进程ID为名称的目录中有关该进程实时内存信息,包括网络,文件句柄、启动点、执行命令等等。本文虫虫以进程堆栈为例子,介绍通过/proc/进程号/stack文件的内容来实时跟踪进程堆栈信息。   进程阻塞 为了解决这个问题,让我们考虑一个进程阻塞的过程,以TC...

bollwarm的专栏 2844

gdb中查看堆栈信息

frame n命令可查看某一个frame(函数,栈帧)里的变量值等信息。frame命令可以查看当前frame(函数,栈帧)里的变量值等信息。info locals:打印出当前函数里所有的局部变量的命令。down n:表示往栈顶方向下移n层(n默认值为1)info catch:打印出当前函数中的异常处理信息。n是bt命令返回的数字,标识是哪一个frame。(4)up/down命令,向上或向下移动栈帧。(2) f(frame)命令。(3)frame n命令。(1)bt命令,如下。

hhhlizhao的博客 3760

Linux 中断过程堆栈切换之trampoline stack

查了一天堆栈切换的资料,发现大家都在讲user stack 、kernel stack、interrupt stack、IST,但是没有人讲一下trampoline stack,这对初入kernel的小伙伴不太友好的trampoline stack,这里分享一下心得: 进程在执行的时候,必然会使用到系统调用或者中断,按照SDM中的描述,中断发生时,硬件会自动切换堆栈到内核堆栈: 这个切换后的堆栈的地址是存放在TSS中ESP0(或RSP0)中的: 问题是RSP0中存放的到底是哪个stack?

mabin2005的专栏 1975

Linux下 gdb 调试-查看函数堆栈-操作说明一

Linux下 gdb 调试-查看函数堆栈

wojiaxiaohuang2014的博客 7369

如何快速查看进程/子线程堆栈

如何快速查看进程/子进程堆栈

木简熙的博客 6254

STM32 IAP+APP合并Hex文件全自动脚本(Keil5一键生成)

本文详细介绍了一种基于Keil5开发环境的STM32 IAP与APP程序Hex文件全自动合并方案。通过编写批处理或Python脚本,并将其集成到Keil的编译后流程中,实现一键编译、自动合并,彻底解决手动操作繁琐易错的问题,极大提升STM32固件开发与远程升级的效率。

weixin_29191761的博客 307

Linux中用gdb 查看代码堆栈的信息

Linux中用gdb 查看代码堆栈的信息

weixin_44869026的博客 6193

11-4 AEB 算法原理及系统组成

本专题旨在探讨如何利用仿真软件开发自动紧急制动系统AEB,主要通过整理开发流程,实现从需求到验证的全流程掌握,为后续开发提供支持;同时,研究了如何在汽车自动驾驶仿真工具中开发自己的算法,并解决了从ISO、E-CNAP、GB/T以及交通法规等提炼出功能需求的问题,以快速实现原型模型的开发。本专题重点讲解了AEB的工作原理、系统/软件架构和需求、算法模型及实现、CCRs/CCRb/CCRm建模与仿真、VRU-AEB-B/P/M建模与仿真,同时还提供了测试用例,期待将AEB算法成功地产品化。

AIgraphX 8556

linux如何查看一个进程的堆栈

方法一:pstack pid NAME        pstack - print a stack trace of a running process SYNOPSIS        pstack pid DESCRIPTION        pstack  attaches  to  the active process named by the pid on the comman

nanjingligong的专栏 2万+

Librepilot _64位window10环境下的搭建及一些坑的解决办法

  刚入IT行业的小菜鸟,在window上折腾了四天的librepilot地面控制站的搭建,想着这么辛苦不能白费了,看网上相关资料少得可怜,唯一一个详细教程还是在32位环境下,一大堆坑,所以把自己的经验写下来,供大家一起参考。 参考的原文是:https://www.cnblogs.com/jasonchan1202/p/7809937.html的博客,但是执行下来才发现这个博客对64位系统极其不...

weixin_41426339的博客 2728

Howland电流源电路:从理论到实践的深度解析与优化策略

本文深度解析了Howland电流源电路的工作原理,从经典四电阻架构的“虚短”“虚断”分析,到其实现宽带恒流输出的理论优势。重点剖析了实践中因电阻精度、运放参数及PCB布局导致的性能瓶颈,并提供了引入第五电阻、优化运放选型等关键优化策略,旨在将输出阻抗从kΩ级提升至MΩ级,以满足精密测量与传感器驱动等应用需求。

weixin_29243063的博客 443

Arthas - stack 命令,查看方法调用堆栈信息

Arthas stack 命令:快速定位方法调用链 🚀 摘要:本文介绍阿里开源诊断工具Arthas中的stack命令,通过真实Java示例演示如何追踪方法调用堆栈: 核心功能 实时捕获指定方法被调用时的完整调用链路 支持类名/方法名通配符匹配(如stack *Service *Method) 可附加条件表达式过滤特定调用场景 典型应用场景 定位日志频繁打印的源头(如异常审计日志) 发现非预期的多层嵌套调用 确认生产环境中的代码执行路径 实战案例 以Spring Boot登录审计系统为例,当logFaile

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

基于STM32F407标准库与SimpleFOC实现无刷电机2804位置闭环控制的实战解析

本文详细解析了基于STM32F407标准库与SimpleFOC算法实现2804无刷电机位置闭环控制的实战过程。通过硬件选型、速度闭环调试到位置环PID参数整定,提供了完整的工程实现方案和抗饱和策略,帮助开发者掌握高精度电机控制技术。

oauth7security的博客 918

堆栈信息分析:/proc/<pid>/stack

中获取的线程调用栈信息,显示了进程 PID 为 6170 的某个线程在内核态的调用栈。如能提供更多信息(比如 Patroni 日志、Postgres 状态、容器资源配置),我可以进一步定位问题。是否需要我帮你生成一些排查脚本?(Fast Userspace Mutex)是 Linux 的一种轻量级用户空间锁机制。当一个线程需要等待某个锁释放时,它会被挂起在。)中看到 Patroni 的卡顿情况。看日志是否在等待锁、leader 选举相关的动作。上,可能说明线程池被锁阻塞。看是不是很多线程都卡在。

喝醉酒的小白 1022

【毕设实战】飞行器目标识别系统:基于YOLOv5的智能检测全流程教程,助你毕设脱颖而出

本文介绍了一个基于YOLOv5的飞行器目标识别系统的开发过程。系统包含数据采集与标注、模型训练、实时检测和UI界面四大模块。文章详细讲解了从环境搭建、数据标注到YOLOv5模型训练的全流程,包括如何划分数据集、配置参数和测试模型性能。同时提供了实时检测代码示例和UI界面开发思路,使读者能够快速实现一个完整的智能检测系统。该系统可应用于军事侦察、民用巡检等领域,具有较高的实用价值,适合作为计算机视觉相关的毕业设计项目。

FJN110的博客 108

基于STM32F1XX 、HAL库的OPT4001-Q1环境光传感器驱动应用C语言程序设计

OPT4001-Q1 的输出是半对数 的,具有 9 个二进制对数满量程照度范围,每个范围内具有高度线性响应,使得 PicoStar™ 型号的测量能力为 312.5μlux 至 84klux,USON 型号的测量能力为 400µlux 至 107klux。// 禁用中断(示例)

PP_Cottage的博客 462

linux内核打印堆栈信息_如何在Linux内核中输出函数堆栈

linux内核打印堆栈信息In Linux Kernel, we usually trace/debug what kind of events will trigger the phenomena we find in the system. For example, what kind of event will trigger the fact that the timeslice of o...

cuma2369的博客 1493

STM32 BOOTLOADER配置以及APP跳转实现(裸机)

Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。APP就是我们的应用程序,经过硬件引导程序之后跳转到系统程序运行。

吻等离子的博客 3356

linux 查看进程堆栈,linux进程与它的堆栈空间

一)概述.堆栈是一个用户空间的内存区域,进程使用堆栈作为临时存储..堆栈中存放的是函数中的局部变量,在函数的生命周期中可以将变量压入堆栈,编译器需要确保堆栈指针在函数退出前恢复到初始位置,也就是说,内存是自动分配和释放的..C/C++把存储在堆栈中的局部变量当作automatic存储,并使用auto关键字,这是局部变量的默认存储方式,所以现在没有人用auto关键词..与动态存储相对映的静态存储,也...

weixin_39717029的博客 1542

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java Stack 堆栈

本文介绍了 Java Stack(堆栈)的相关内容。。。

Regino的博客 507

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JAVA应用闪退,堆栈日志中出现EXCEPTION_STACK_OVERFLOW

公司的产品,在进行一项操作的时候,每次都会

4649

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

银河麒麟操作系统中设置进程堆栈大小的方法

在银河麒麟操作系统中,进程的堆栈大小是一个重要的系统参数,它决定了程序可以使用的堆栈内存的最大值。堆栈主要用于存储局部变量、函数调用等信息,对于某些需要大量堆栈空间的程序来说,调整堆栈大小是优化系统性能的一个重要手段。本文将介绍如何在银河麒麟系统中临时和永久地修改进程的堆栈大小。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

堆栈stack,堆heap

网上搜索的相关资料,加以整合。 堆栈(英文:stack),也可直接称栈,不同于堆。堆,顺序随意。栈,后进先出(Last-In/First-Out) 在计算机科学中,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端(称为堆栈顶端指标,英文为top)进行加入资料(push)和输出资料(pop)的运算。另外堆栈也可以用一维阵列或连结串行的形式来完成。堆栈的另外一

一玩儿家的田地 929

PHP查看堆栈信息,php-stacktrace: PHP进程外查看函数调用堆栈

生产环境多多少少会遇到CPU占用很高或者卡住的PHP进程,这时怎样才能知道这个进程在干啥呢?一个方法是strace跟踪系统调用和参数,这样能大概知道PHP进程在干啥。要看到具体的PHP函数就需要用PHP扩展(xdebug、xhprof)或者用GDB调试,高级点还可以用DTrace。上周发现了ruby-stacktrace,它直接读取ruby进程的内存来获取堆栈信息,不用GDB和扩展,所以性能很好,...

weixin_36184835的博客 623
上一篇: cat xx | grep xxx读取某某文件入终端通过管道给grep,grep输出有xxx的行
下一篇: 所有排序算法,稳定,实现,时间复杂度,示例
zjkzjk7711
博客等级 码龄4年 671粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值