|
|
目录/ C' j8 R9 c) p- y! ~8 b
/ N% }4 F% ?6 b: N0 h. z
4 C- Y) U: `% e. u5 j+ D- 安装
+ S+ I7 l9 j. d1 Y" x v4 j" o - 验证
6 U5 q$ z4 h! S5 k* B* K - dotnet-dump
8 C0 \+ }: l) ?- t( z! R - createdump
$ G# R- O1 I1 v( g0 u - 分析coredump文件
Z& u6 k8 n( j - 相关资料:2 O( Z. V1 U7 `4 ~
6 \+ {; G: M9 w6 U
安装- W h7 k& [+ r3 N* @1 \
! n9 L2 @$ X" v+ G
% i4 q5 Q9 \' [/ O
- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像
& f5 R' B) Z) I& [3 v8 j - 准备Dockerfile7 o$ I0 |: ?1 e$ ?: R& a& Y% g
- FROM mcr.microsoft.com/dotnet/sdk:3.1 AS sdkRUN dotnet tool install --tool-path /tools dotnet-traceRUN dotnet tool install --tool-path /tools dotnet-countersRUN dotnet tool install --tool-path /tools dotnet-dumpRUN dotnet tool install --tool-path /tools dotnet-gcdumpFROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtimeWORKDIR /toolsCOPY --from=sdk /tools .basedockerfile.yaml
复制代码 验证3 F; m% J; P7 |+ n7 a
8 U! n# A7 w& k+ c2 J% T% _基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
) J: A8 c8 t/ O5 |; z3 _' _用我们刚才制作的基础镜像随便起个demo程序验证下2 w: B% b* k! ]3 n# K5 S
6 `" b. h3 m# R0 D5 O; ]3 c. P- 已经包含了tools文件夹了,里面存放了我们的tools工具
( V9 q5 m, P. k" f; @
2 r4 J5 W8 _6 ]
4 ~% l+ f) D7 q9 L2 n& F ' T# M: I% h3 \5 }! p& j
- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)2 ` g1 r( l0 m. l
5 T2 ~( z" Y5 ?) R3 \ d
至此包含tools的runtime基础镜像制作完毕。9 E; Y0 E/ f9 \7 a
9 L( o7 X/ x( V8 X4 Y( {dotnet-dump+ w8 }# h: E* F. {
4 @: _8 v; B/ Z3 w. g# n它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致& U p1 d, M b7 G5 i1 B9 X/ H) p) _
% l2 e( @1 Y5 Xcreatedump
+ C7 \( V( `8 `) n; U* _6 I
# H% U" p8 G/ s& p8 t它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
# R1 z' V3 h1 E9 @! T& G虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
4 w1 t0 t7 C- L" b4 f& W' {" K这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
1 { |& ]% r* I3 t, _) j开始使用:
$ a% s" j5 B8 T 3 W& D/ c" u( ?. `6 }% ~
- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)3 S- C# q) Q5 o3 h7 ?1 ^ P6 S, l9 D
2 c& X) {% U( h0 D7 @% p0 O
- N6 ~ @& T5 x- f" u3 j- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功
) I" \5 p, D W+ r - 如果报权限相关错误,可以在你的yaml文件里加上:# p0 A, p$ ]$ n' K1 ^; k
! v( A3 h4 E! H4 Z/ L
: c) f( \' k) n- L" j7 w- k7 u1 N分析coredump文件
" {! s# g- w$ e( }* n7 U+ q' Z6 N) W+ [; c' K# m
先将上面生成在tmp下的coredump文件copy到可以调试的地方7 h& m, Q) X/ ?( u, w* R6 _
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s" z4 @$ t- t7 ~/ j( H" c& R
- W# M: v6 }' z+ [& r% x. ]. B然后为我们的coredump.1文件下载关联的symbol:+ o% D4 l; i% a9 l+ `, ]! n6 N( z
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把' j$ M9 t% J) h( K
5 ~& G+ q$ g# \* |+ T" Y4 g
4 }( S* ^% [: K# h8 o
- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
* E1 g9 G( z; n0 K6 e - sudo yum install dotnet-sdk-3.1, ]% u5 y9 n l1 M
如果dotnet-symbol没有安装的话,安装一个( L; Z) w2 f# H4 }1 W4 v# K |: ^
6 s/ t6 W$ ?4 V$ p- }6 H 2 r1 n* h/ _" c% j9 O/ _
- dotnet tool install --global dotnet-symbol
8 X3 K% h# O' D6 \0 u+ v - 然后关闭当前终端,再打开一个新的- f8 x; `7 ?0 ^* v# Q. d8 a
然后执行dotnet-symbol --host-only --debugging coredump.1+ ]! C. \0 n7 B" \' ]. j
/ V4 k4 o4 N+ A0 P8 u# i! j" ?5 G3 W6 T6 k+ S1 k2 I1 C+ c
% d' O' K$ @6 J/ P3 h- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
% W! z" H" m+ p. m% _
: c$ H+ z5 J7 G& _0 _2 }* h然后我们使用lldb进行调试
?1 Y: ` v, }. n R
$ I, A& J: A- G; m + b D$ [6 S0 M+ L9 Z# a5 v. [, q: @
- 如果你机器里没装的话,先装一个吧
. z$ ^+ u3 X8 R6 D" i) _9 B - 安装sos插件:
, H! c. U, m8 [+ g3 I* p : C+ I' j: `9 I1 U) @# A' p' H* Q
- dotnet tool install --global dotnet-sos / D k' b7 `9 f
- dotnet-sos install 8 o2 |, t7 Q5 d( H/ A+ s
. s1 h% w" x" T2 r
- lldb-8 --core coredump.1 ' Z6 m( g) n0 D( F
- 然后就可以用lldb来分析dump文件了
$ I& v: N4 v. V. J: C 7 R% p8 G+ Q- x5 v) f, G
相关资料:
8 ^ g0 ]& X* f( m- A6 }( w2 [- J
6 Y/ ?! `* [' ~( J9 k
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol
M( o. Y/ ^5 \0 ? b+ P - https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md
8 o5 V. g9 e4 ^& D5 X1 F& u! \ - https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ 9 u- E8 ~0 m8 R+ k5 M
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md
# _, y7 J. y4 k9 _ - https://github.com/dotnet/runtime/issues/11012 0 h* \2 b& S- j; d& |. L0 n( G' V- E
- 关于大对象使用的注意点以及官方blob gc的实现描述
v8 E K; s# e- q$ U, \+ s 以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!' ^# h. x7 |" L; M4 j
; K* h. }2 g4 P9 R3 E/ {" B来源:http://www.jb51.net/article/232931.htm
' ^1 t9 w* O5 S+ v8 } O免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|