首页 > 其他分享 >Debug 利器:pstack & strace

Debug 利器:pstack & strace

时间:2023-08-19 14:33:43浏览次数:39  
标签:gstack strace pid pstack 进程 线程 Debug

Debug 利器:pstack & strace 

2019-12-05 04:15  陈心朔  阅读(8026)  评论(4)  编辑  收藏  举报

工作中难免会遇到各种各样的 bug,对于开发环境 or 测试环境的问题还好解决,可以使用 gdb 打断点或者在代码中埋点来定位异常;
但是遇到线上的 bug 就很难受了,由于生产环境不能随意替换、中断程序,如果日志中找不到问题原因,解决问题就会很棘手

这时候就需要请出这两位 debug 利器了 ———— pstack & strace

什么是 pstack

pstack 是 Linux 系统下的一个命令行工具,此命令可以显示指定进程每个线程的堆栈快照,便于排查程序异常和性能评估

pstack 是基于 gdb 实现的,通过 man pstack 可以发现,它其实是 gstack 的一个软链接

GSTACK(1)                  Linux Programmer's Manual                 GSTACK(1)
 
NAME
       gstack - print a stack trace of a running process
 
SYNOPSIS
       gstack pid
 
DESCRIPTION
       gstack attaches to the active process named by the pid on the command line, and prints out an execution stack trace.  If ELF symbols exist
       in the binary (usually the case unless you have run strip(1)), then symbolic addresses are printed as well.
 
       If the process is part of a thread group, then gstack will print out a stack trace for each of the threads in the group.
 
SEE ALSO
       nm(1), ptrace(2), gdb(1)
 
AUTHORS
       Ross Thompson <[email protected]>
 
       Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
 
Red Hat Linux                     Feb 15 2008                        GSTACK(1)
[root@Centos6x64 bin]# pwd
/usr/bin
[root@Centos6x64 bin]# ll -h | grep gstack
-rwxr-xr-x. 1 root root    1.1K 3月  22 2017 gstack
lrwxrwxrwx. 1 root root       6 8月  24 21:21 pstack -> gstack

而 gstack 则是封装了 gdb 功能的 shell 脚本,通过 " thread apply all bt " 的命令获得输出所有的线程堆栈信息,再用 sed 进行替换和过滤

# 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'

 

什么是 strace

使用 pstack 获得的进程堆栈是程序的静态信息,而使用 strace 可以获得程序的动态信息,即程序现在正在做什么(执行哪些系统调用和所接收的信号)

strace 的功能主要是通过 ptrace 这个系统调用来实现的,它提供了父进程观察/控制子进程的能力

#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);

详见:ptrace(2) - Linux man page

当使用了 pstrace 跟踪子进程后,所有发送给被跟踪子进程的信号都会转发给父进程(SIGKILL 除外),而子进程则会阻塞,被标注为 TASK_TRACED 状态

父进程收到信号后,可以对阻塞的子进程进行检查和修改,然后让子进程继续运行

 

关于 strace 的参数可以参考:strace 跟踪进程中的系统调用

或者查看 Linux 手册 man strace

 

如何使用 pstack & strace 排查程序问题

pstack 的用法

通过 ps / pidof 命令获取到异常进程的 pid,执行 pstack [pid],我们可以获得以下输出:

从上面的输出中我们可以得到很多信息

  • 当前进程中有多少线程
  • 各线程当前的调用堆栈(即这个线程正在做什么)

通过这些信息,我们可以简单判断线程是否挂死或者阻塞,再通过堆栈信息定位到代码中具体的函数进一步排查

另外需要注意一点,只有保留了 debug symbols 的程序才可以 pstack,否则将看不到调用栈(如下图)

 

strace 的用法

strace 的用法也很简单,常用的选项有这几个:

  • -f 跟踪目标进程,以及目标进程创建的所有子进程
  • -t 在输出中的每一行前加上时间信息(-tt 表示微秒级)
  • -T 显示每个系统调用所耗的时间

执行 strace ... -p [pid] 我们将获得如下的输出:

通过观察系统调用我们可以确认当前程序的行为,分析其消耗的时间、返回值是否正常

可以过滤指定的线程号,确认当前线程的行为是否符合预期

如果执行命令后完全没有输出,那么可以怀疑是否由于网络、IO等原因导致阻塞,或程序产生死锁

 

小结

有了这两个工具,当出现线上异常时,如果情况紧急,我们可以收集程序当前状态的信息,再进行救灾
待生产环境稳定后,可以慢慢分析是哪里产生的问题

另外分析 pstack / strace 的信息时,最好和日志对照观察

标签:gstack,strace,pid,pstack,进程,线程,Debug
From: https://www.cnblogs.com/yaoyangding/p/17642442.html

相关文章

  • pstack,strace,gdb工具使用
    pstack,strace,gdb工具使用MySQL的几种调式分析工具介绍MySQL的几种调式分析工具,常用的有如下4种:pstackgdbstraceperf如下分别介绍之。pstack注意:pstack所追踪的是用户态调用栈获取堆栈信息问题线程的定位负载较低mysql_pid=23632pstack$mysql_pid>pstack.infopt-pmp对堆栈......
  • Systrace看GPU渲染花费时间之Fence
    一、前言如上图所示的Systrace中,VSYNC-app基本上没有什么变化,但是VSYNC-sf却一直在更新有可能是什么原因?VSYNC-app的作用通知app去开始进行绘制渲染更新UI了,DispSync按照屏幕的刷新率的速率去通知app,因此app会以跟屏幕刷新率匹配的速率去绘制渲染更新UI。而在手......
  • python 中如何快速查看代码的性能 DebugInfo 秒表装饰器
    背景我们在python编程时,在有性能优化需求的场景下,我们可能一个需求存在多个解决方案的情况,这些解决方案可能在不同的模块/库中实现。那么对于可以实现两样的功能,但实现方式不同的情况下,我们直接测试一下每个方式的运行性能,是最直观评估不同的实现方案性能的办法。一般解决方法......
  • 《VS篇》Debug和Release的区别
    Debug和Release的区别参考链接:http://c.biancheng.net/view/4124.htmlRelease版本是不支持调试的,只有Debug版本才支持调试。Debug版本Debug是“调试”的意思,Debug版本就是为调试而生的,编译器在生成Debug版本的程序时会加入调试辅助信息,并且很少会进行优化,程序还是“原......
  • winform编译时怎么把指定dll拷贝到debug里面(非引用)
    选中winform项目-》右键属性-》选择生成事件-》在生成后事件命令行配置以下代码Copy"$(ProjectDir)dll\*.*""$(ProjectDir)$(OutDir)" ......
  • glDebugMessageCallback函数是什么?
    图形编程想要调试并不是一件容易的事,有的时候渲染出全黑的结果基本上只能凭经验来查错,特别是对于着色器,断点日志都是无效的,因此想办法掌握一些调试方法还是有必要的,不然找错误的源头可能真的会非常困难参考:https://blog.csdn.net/Jaihk662/article/details/108801019glDebugMess......
  • Pycharm Debug功能详解
    初学Python时,我们可能都是通过print来调试程序,但这种方法效率不高。入门Python后,Pycharm的Debug功能还是有必要学一下的,可以提高调试代码的效率。什么是Debug模式:简单说Debug模式和正常运行唯一的区别,就是会在断点处停下来,可以通过控制一行一行的去运行代码,而且可以看到整个运行......
  • Debug Assertion Failed! Program: C:\Windows\SYSTEM32\mfc140ud.dll
    新建C++ MFC项目多文本对话框的模板,运行出错。解决办法:这是由于DockControlBar(&m_wndToolBar);引起的异常。在头文件MainFrm.h中重新定义  CMFCToolBar m_wndToolBar; 类型DockControlBar(&m_wndToolBar)改为DockPane(&m_wndToolBar);再次运行就不会出错了。......
  • 跳过前端网页无限debugger
    跳过网站循环debugger在debugger处打断点后点击浏览器禁用断点后刷新页面在debugger前行号处右键,选择一律不在此处暂停添加Addconditionalbreakpoint填写false替换文件参考文章......
  • 無法將檔案 "obj\Debug\xxx.exe" 複製到 "bin\Debug\xxx.exe"。由於另一個處理序
     解决方案:暂时不清楚为什么关闭debug后再次发起debug会出现这种情况,但是这种方法可解决上述错误 ......