- 积分
- 16843
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
在开发中,coredump会输出珍贵的调试信息,但在linux下默认是关闭的,所以,要手动去把它打开。6 }! Z+ ^: }* i6 M! t
执行以下脚本,退出后重新登录即可,重新登录后执行ulimit -c,如果出来的是unlimited,就是已经打开了,且不限制coredump生成的core文件大小
6 _4 M1 g8 C1 _9 j7 R' Y9 i1 X+ ~/ i7 H; t/ f4 b
#!/bin/bash
+ O! {; K( ^; @, I# _- c+ c* u, Y) [2 K( u+ G) n
### Filename: coredumpshell.sh7 n( c7 W) A. L# ~# \6 N& x
### Description: enable coredump and format the name of core file on centos system+ j) _. f7 p9 ^7 F9 \
9 \, ?3 T% j1 G7 }+ O
# enable coredump whith unlimited file-size for all users2 `9 q0 b! j. T4 i+ q% E$ v$ u
echo -e "\n# enable coredump whith unlimited file-size for all users\n* soft core unlimited" >> /etc/security/limits.conf, [7 {" U! B3 @6 {) g
# e. Q+ M. H; [' x( X$ B- i8 Q
# set the path of core file with permission 777
& H7 j1 g1 X3 @$ M/ d$ Acd /mydata && mkdir corefile && chmod 777 corefile* s: }5 j1 L. p% Q9 d: J
4 v1 X: S" C* q( W* k
# format the name of core file. % z% e0 \0 i- \/ g) ?
# %% – 符号%( g6 K1 R/ N v% e3 Y
# %p – 进程号% |( d4 C+ u8 U$ G3 n
# %u – 进程用户id
5 ~/ u9 l" g' i8 |8 L& q# %g – 进程用户组id
/ K9 }9 f! ^1 a' q. y$ Z# %s – 生成core文件时收到的信号
{' v/ B5 L1 z* R6 w9 a0 G# %t – 生成core文件的时间戳(seconds since 0:00h, 1 Jan 1970)
' `- d& p1 @" g9 ~: |. S5 J# %h – 主机名+ O! L" N& V( `0 {4 A
# %e – 程序文件名
/ v9 b0 m: X2 O# j8 E+ r, @. H; Vecho -e "/mydata/corefile/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern' m6 r% `+ w% z9 B M1 \0 L, N1 X
7 c7 S6 q* e! {' j$ {' W5 n# for centos7 system(update 2017.2.3 21:44)0 m+ \7 `( q7 R
echo -e "/mydata/corefile/core-%e-%s-%u-%g-%p-%t" > /etc/sysctl.conf
) X4 w9 R: s) N+ h8 A: r4 M& G- n9 S9 P
# suffix of the core file name) Y. Z4 ^8 M; q4 Y
echo -e "1" > /proc/sys/kernel/core_uses_pid0 @7 j; X0 x! {( Z# f% R
d) |% I- b4 T) b, t) \
_0 N( G# w( ]0 D9 h/ Ecentos下; Q) D. n1 X* k1 s
生成方式
% A. y! c! j4 L E. v( w. i K. ?: H## 查看是否开启,0表示没有开启,>0表示生成最大的coredump的大小(单位kb),可使用参数unlimited取消core文件大小的的限制- T W; {8 Y3 j6 X: H
ulimit -c , t% E' a$ C, H& q3 e: w6 p& O
ulimit -c unlimited 8 E( G7 p$ f% x d8 n& d
ulimit -c 0) E6 G' w, Q( `3 _, w! u
ulimit -a
5 L5 ` ^& A8 ?% f" G X j转储文件命名规范, t. j( y+ R. S" T6 h
## 设置是否添加pid作为扩展,1:添加 0:不添加2 p* _) F" C* y/ D) E
cat /proc/sys/kernel/core_uses_pid
2 F. ^+ z, t9 L0 z) b; C7 O## 设置文件产生时的命名
5 [+ h! c2 k' ^, rcat /proc/sys/kernel/core_pattern9 _8 C7 d6 L ?& M; N4 G) p
##通常这样设置:, _6 E& D: L" P( i% g
/opt/tmp/core/core-%e-%s-%u-%g-%p-%t
" l0 l$ y& X" l+ I% {, d3 d参数介绍
6 I$ f1 n+ w$ X/ K' S1 R" I$ M%p : insert pid into filename # 添加pid
/ I( E# Z- p9 z3 }%u : insert current uid into filename # 添加当前uid; ?( j4 k1 w: ]! i) \, K
%g : insert current gid into filename # 添加当前gid
* |; R/ A3 D0 i%s : insert signal that cased the coredump into the file # 添加导致产生core的信号
8 ~: q6 ]1 k/ {5 r9 Q4 m. P3 y# y%t : insert UNIX time that the coredump occurred into file# 添加core文件生成时的unix时间
& o+ B% G2 {/ a k9 `9 k8 X8 F%h : insert hostname where the coredump happened into file# 添加主机名( K9 [. R5 Q* f: D9 M
%e : insert coredumping executablename into file # 添加命令名2 @" H9 W) u0 y$ W
产生core的测试
3 v. t% J! \2 }! N: @kill -s SIGSEGV $$
- L& O& m9 r7 j. O* I- n0 nLinux上的信号3 B. x9 ^ L* i% J7 a- E& W( Z
发生coredump一般都是在进程收到某个信号的时候,Linux上现在大概有60多个信号,可以使用kill -l命令全部列出来。
+ n- B# `% O% P( T- {- P1 K" A5 h# P, M5 k5 a( ^' `
针对特定的信号,应用程序可以写对应的信号处理函数。如果不指定,则采取默认的处理方式,默认处理是coredump的信号如下:' _# i' T3 g1 U Z" Z. I
, F$ y( M# p; n- s( {( ^* U3) SIGQUIT 4) SIGILL 6) SIGABRT 8) SIGFPE 11) SIGSEGV
' w2 B% S* p6 j4 r. j6 {9 r$ k3 c9 }7) SIGBUS 31) SIGSYS 5) SIGTRAP 24) SIGXCPU 25) SIGXFSZ+ N2 `8 Z" @, C0 Q5 n" T
29) SIGIOT
& o# m) _ l* {. j; Dcore的使用" W6 A9 W8 s' K( p
编译的程序如果不添加-g,在core中不会有行的信息,如果希望产生更详细的core文件,编译程序时需要指定-g。9 v6 I$ l" I# X9 y3 X0 c9 T
" \1 b. ], O2 r b3 V* w
gdb execute corefile' ?! }) a1 c8 F, i7 S# j. e
gdb 基本使用命令& K3 _3 b% O# Z y& c3 K
# 设置断点4 R# f' R2 B* s( M$ i+ u6 Y
b 行号|函数名4 c( x# i; p6 K8 s! c+ }6 {
# 删除断点: M, v0 s0 ~; H% n" A! {
delete 断点编号
8 X1 z7 {! X: J" O6 l$ U# J4 @* K5 T# 禁用断点
5 k: {( n0 I# l$ X0 {1 h1 D8 E4 adisable 断点编号
3 Q# D4 q# M& Z! u# 弃用断点
3 q' |- B0 a: j( ]0 G6 L7 oenable 断点编号
( [2 `0 V$ ^! }/ |' {7 o2 H# 单步跟踪
" X% n. Z: s$ j! @, V( anext
4 T" v1 @- ?& w5 Z/ o# 单步跟踪
# p, E: h9 [9 Cstep
+ q3 j$ |1 [$ s# s4 w& \# 打印变量7 i& K% i: ]# q) [) F6 I
print 变量名
" _6 |6 _& B1 {8 T8 ^2 c) n# 设置变量
+ d! T* f( c, |( Qset var=value
/ }4 H5 J5 q0 V0 T2 P9 r# 查看变量类型
L+ r1 e. [8 K$ ~ptype var) \2 a2 W# j1 x* z
# 顺序执行到结束: o- L8 r7 U+ j$ ], f" }# l+ k
count. _1 o! L j6 H' `( o- I# Z H
# 顺序执行直到某一行
8 M6 m' ], s% k# \/ Z/ Q% a" v, H; Dutil lineno
0 b7 c6 f+ P% f+ ]# 打印堆栈信息
& G. X8 g; I) [5 Rbt. v0 X+ g' D. O& ]- \ G
H+ T3 f2 v( t8 V; I9 U |
|