a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 53|回复: 0

[综合辅导] Linux认证辅导关于Linux下pstack的实现

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux认证辅导关于Linux下pstack的实现* Z  i: S) T) e, ^! V
Linux下pstack的实现
, S, L, W* y4 E' R3 |8 z0 ^Linux下有时候我们需要知道一个进程在做什么,比如说程序不正常的时候,他到底在干吗?最直接的方法就是打印出他所有线程的调用栈,这样我们从栈再配合程序代码就知道程序在干吗了。6 s; r1 R) P2 S& P9 |' D
Linux下这个工具叫做pstack. 使用方法是5 o" L3 l& M2 n) @- f/ o
$ F  v, H$ i# s
# pstack; E9 E0 d# o6 W  o: U; ~: T
Usage: pstack 《process-id》
8 g+ j2 d' o, Z$ A) C' w' A1 l9 q当然这个被调查的程序需要有符号信息。 比较雷人的是 这个程序竟然是个shell脚本,核心实现是gdb的 thread apply all bt, 我们可以观摩下他的实现,这个我们做类似的程序提供了一个很好的思路:0 S8 K9 [- D4 P, h" s( Y1 m5 G
$ S0 B# Q) @; P: g& A7 m
[root@=i ~]# cat `which pstack`
$ M9 Y# G5 I& Q! a( `' v#!/bin/sh
2 a5 }$ [( o* p! B7 N$ Nif test $# -ne 1; then
6 M+ a# Q( x  }. e7 [echo “Usage: `basename $0 .sh` 《process-id》” 1》&2
2 o; r! X+ B+ C: hexit 1
8 {5 \6 t; m+ V( }2 Rfi- j% G) @7 b  X7 b6 o& I) [
if test ! -r /proc/$1; then. U$ [3 O% N5 O) p  S! B. I8 A$ z# ^
echo “Process $1 not found.” 1》&2
# \9 H( z$ o' J' ?6 H1 h7 ?exit 17 S% J+ {* Y4 j( L7 u
fi: z+ _* `4 Y8 L; I7 Y
# GDB doesn‘t allow “thread apply all bt” when the process isn’t4 O1 a. E( u8 Z0 j
# threaded; need to peek at the process to determine if that or the% F' Q* f1 C3 A0 G
# simpler “bt” should be used.! Y; \+ U8 V( b3 Q! T0 s, p! u
backtrace=“bt”, ^& [4 |5 D" l6 k
if test -d /proc/$1/task ; then4 Y$ Z8 \4 l4 D6 w
# Newer kernel; has a task/ directory.
& A+ D3 c+ L. f; H/ S) l8 r3 F0 Rif test `/bin/ls /proc/$1/task | /usr/bin/wc -l` -gt 1 2》/dev/null ; then! b9 E3 k1 ], ]3 V  ~, u
backtrace=“thread apply all bt”
7 |  G0 Y6 z0 h1 m1 ofi: y3 V' N0 t2 M! F6 d5 W+ q
elif test -f /proc/$1/maps ; then9 q( B3 r" K4 }) W5 P
# Older kernel; go by it loading libpthread.6 S( `! a7 E' @) m6 U# O8 K
if /bin/grep -e libpthread /proc/$1/maps 》 /dev/null 2》&1 ; then
& `4 [, G8 I4 }/ e  a6 ybacktrace=“thread apply all bt”
6 e' O! X) n( D: jfi
3 F  V; F. \9 Z! x7 Yfi
. G+ [# o) v% hGDB=${GDB:-/usr/bin/gdb}9 L/ z( ]' x# w  @
if $GDB -nx --quiet --batch --readnever 》 /dev/null 2》&1; then- U0 B- M% C  H5 r# q& F
readnever=--readnever  \4 V: C& c* ^1 E
else
! `( C& X- p/ c$ e6 z  Ereadnever=
# u! B- l$ h) m+ a9 Q7 rfi" s" M5 P( U7 f) `1 @3 x! {( Q
# Run GDB, strip out unwanted noise.7 p( H! h+ u$ _: X
$GDB --quiet $readnever -nx /proc/$1/exe $1 《《EOF 2》&1 |
# y6 m% Y1 J5 A) s" j2 {$backtrace
: m/ q! Y) b# i7 wEOF
. h6 A" T5 r  N2 n/bin/sed -n \
3 N7 D# m' z) k6 y( J! f-e ‘s/^(gdb) //’ \2 L+ ~4 K! \) a1 Q& C) V1 A# r: q
-e ‘/^#/p’ \
6 n) f& |# J1 W3 b-e ‘/^Thread/p’
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-17 20:55 , Processed in 0.741219 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表