Ubuntu下程序进程堆栈信息——gstack

news/2025/1/15 21:43:18/

前言

在Ubuntu下调试程序,大部分是启动前使用gdb进行调试,当然也有其他方法,程序在运行中,为了不打断程序正常运行,也有一些工具进行调试。

当前本文章旨在说明不安装其他额外程序或库(除gdb外),并且在程序占用CPU过高想查看那些函数或库导致的,可使用如下方式。

Gstack

查看进程堆栈信息,Java推出jstack可以查看,C++也可以使用名为gstack命令进行查看,在本文作者查找gstack如何在ubuntu安装时遇到问题,只看到有gstack命令使用或介绍,并为搜索到安装命令,但在外网有幸找到,使用起来也挺方便,基本思路如下:

  1. 自己编写的程序CPU占用较高,程序名为`talker`
  2. 查看自己程序pid,如当前程序`talker`主进程号为:18666
  3. 使用Top -Hp 18666查看线程号,锁定占用CPU过高进程,如18677
  4. 使用gstack 18677,可打印堆栈信息,并得出所在库或函数占用较高问题

代码

关于gstack代码如下,创建名为`gstack`文件,填写内容:

#!/bin/shif test $# -ne 1; thenecho "Usage: `basename $0 .sh` <process-id>" 1>&2exit 1
fiif test ! -r /proc/$1; thenecho "Process $1 not found." 1>&2exit 1
fi# GDB doesn't allow "thread apply all bt" when the process isn't
# threaded; need to peek at the process to determine if that or the
# simpler "bt" should be used.backtrace="bt"
if test -d /proc/$1/task ; then# Newer kernel; has a task/ directory.if test `/bin/ls /proc/$1/task | /usr/bin/wc -l` -gt 1 2>/dev/null ; thenbacktrace="thread apply all bt"fi
elif test -f /proc/$1/maps ; then# Older kernel; go by it loading libpthread.if /bin/grep -e libpthread /proc/$1/maps > /dev/null 2>&1 ; thenbacktrace="thread apply all bt"fi
fiGDB=${GDB:-/usr/bin/gdb}if $GDB -nx --quiet --batch --readnever > /dev/null 2>&1; thenreadnever=--readnever
elsereadnever=
fi# Run GDB, strip out unwanted noise.
$GDB --quiet $readnever -nx /proc/$1/exe $1 <<EOF 2>&1 | 
set width 0
set height 0
set pagination no
$backtrace
EOF
/bin/sed -n \-e 's/^\((gdb) \)*//' \-e '/^#/p' \-e '/^Thread/p'
#end

保存后,将此文件赋予可执行权限如:

sudo chmod 777 gstack

随后将此文件存放至/usr/bin下

sudo cp gstack  /usr/bin/

至此gstack安装完毕

使用

假设,当前程序`talker`程序占用较高,查看pid得出:

test@test:~$ ps -ef | grep talker
test     18666 12982  0 16:07 pts/11   00:00:00 /opt/ros/kinetic/lib/roscpp_tutorials/talker

查看得出当前`talker`占用进程为:18666

查看此程序线程如下:

test@test:~$ top -Hp 18666top - 16:10:40 up 3 days,  7:45,  1 user,  load average: 1.28, 1.53, 1.87
Threads:   5 total,   0 running,   5 sleeping,   0 stopped,   0 zombie
%Cpu(s): 24.2 us, 10.0 sy,  1.0 ni, 64.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16048740 total,  1877016 free, 10243696 used,  3928028 buff/cache
KiB Swap:   999420 total,   356972 free,   642448 used.  4216300 avail Mem PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                          
18666 test      20   0  334212  10204   9308 S  0.0  0.1   0:00.24 talker                                                                                                                                           
18677 test      20   0  334212  10204   9308 S  0.0  0.1   0:00.06 talker                                                                                                                                           
18678 test      20   0  334212  10204   9308 S  0.0  0.1   0:00.02 talker                                                                                                                                           
18679 test      20   0  334212  10204   9308 S  0.0  0.1   0:00.08 talker                                                                                                                                           
18684 test      20   0  334212  10204   9308 S  0.0  0.1   0:00.03 talker  

假设当前线程中`18677`占用CPU较高,可使用gstack查看此线程堆栈:

test@test:~$ sudo gstack 18677
Thread 1 (Thread 0x7f2fc158f700 (LWP 12194)):
#0  0x00007f2fc68c2b13 in epoll_wait () at ../sysdeps/unix/syscall-template.S:84
#1  0x00007f2fc78667e7 in ros::poll_sockets(int, pollfd*, unsigned long, int) () from /opt/ros/kinetic/lib/libroscpp.so
#2  0x00007f2fc78efdb9 in ros::PollSet::update(int) () from /opt/ros/kinetic/lib/libroscpp.so
#3  0x00007f2fc7875825 in ros::PollManager::threadFunc() () from /opt/ros/kinetic/lib/libroscpp.so
#4  0x00007f2fc5f7b5d5 in ?? () from /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.58.0
#5  0x00007f2fc5b4c6ba in start_thread (arg=0x7f2fc158f700) at pthread_create.c:333
#6  0x00007f2fc68c251d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

查看此线程堆栈可知,CPU占用是由ros::poll_sockets导致,这样就可以根据此信息锁定函数并进行对应修改。

如果有其他方便方式查看运行中程序CPU占用较高进行排查的方法,欢迎分享~


http://www.ppmy.cn/news/256914.html

相关文章

k8s部署mysql-exporter,mongo-exporter,redis-exporter,zookeeper-exporter,kafka-exporter

k8s部署mysql-exporter,mongo-exporter,redis-exporter监控 命名空间创建 先建立一个命名空间: prometheus-exporter 用来存放本环境的所有exporter kubectl create ns prometheus-exportermysql监控 如果需要监控多个mysql,可以用一下部分再建一个mysql-exporter 1 创建m…

Prometheus动态发现监控targets【基于文件的服务发现】

为实现Prometheus监控目标配置的动态加载&#xff0c;可通过基于文件的服务发现完成配置 1 Kafka服务的自动发现配置 kafka官方exporter链接&#xff1a; https://github.com/danielqsj/kafka_exporter 在kafka节点上运行docker版kafka-exporter docker run -d -p 9308:9308…

【Thingsboard】docker-compose 部署专业版 Thingsboard 集群

用 tb v3.3.1 演示 一.默认脚本安装 1.下载所有镜像 docker pull store/thingsboard/tb-pe-node:3.3.1PE docker pull store/thingsboard/tb-pe-web-ui:3.3.1PE docker pull store/thingsboard/tb-pe-web-report:3.3.1PE docker pull store/thingsboard/tb-pe-js-execut…

kafka集群搭建与prometheus监控配置

文章目录 1、基于zookeeper的集群2、kafka集群安装2.1 基于Zookeeper集群的配置2.2 基于KRaft模式集群的配置2.3、启动Kafka集群 3、kafka_exporter监控组件安装3.1、安装3.2、系统服务3.3、集成到prometheus 4、与Grafana集成 1、基于zookeeper的集群 下载地址&#xff1a;ht…

Prometheus通过Kafka_exporter监控kafka并发送钉钉报警

1.下载kafka_exporter相关包&#xff1a; wget https://github.com/danielqsj/kafka_exporter/releases/download/v1.4.2/kafka_exporter-1.4.2.linux-amd64.tar.gz2.解压 注意&#xff1a;一个kafka集群&#xff08;CDH kafka集群同样适用&#xff09;&#xff0c;只需要配置…

rk3288-android9-ov13850

说明&#xff1a;最近调试了下rk3288-android9下的ov13850,碰到了一些坑&#xff0c;现整理记录下&#xff0c;避免以后继续踩坑。 一. 代码路径 1.camera代码路径 2.hal3_camera层代码路径 3.camera_engine代码路径 二&#xff1a;修改内容 1. hal3用到的camera3_profile.x…

prometheus 监控kafka(章节六)

前言 由于业务与ELK都使用了Kafka作为消息队列&#xff0c;因此考虑到业务的稳定性与可用性&#xff0c;使用prometheus监控kafka集群。使用的监控方式为&#xff1a;kafka_exporterprometheus。 提示 如果监控kafka集群的话&#xff0c;kafka_exporter只需在集群的一个节点安…

kafka_exporter部署

文章目录 简单介绍环境软件包下载CSDN 部署解压 配置为系统服务kafka_exporter.service启动 Grafana监控配置prometheus.yml修改prometheus监控&插件方案总结 简单介绍 kafka_exporter是prometheus官方提供的用于监控kafka运行状态的exporter 环境 系统版本CentOS7.6.181…