|
|
目录
c& E1 k4 ?( w( G# n3 ~) a' m9 U4 ^, m8 P$ {9 w( L
) e0 w! Z) l- F# ~: P/ Z `- 安装
& p/ q$ i9 r4 B0 y/ d - 验证, }5 ]3 V+ H1 ?$ Z8 \. N8 _
- dotnet-dump7 b' z1 X8 L6 V% {2 w
- createdump" g f- i1 k* R! l
- 分析coredump文件% f( o* @, @. v
- 相关资料:
" K7 H- h2 P, N7 W
& V/ p) U# R- h' y% ]. s2 }安装
( N. N( c8 a6 K1 y
) V5 }; V. P3 ?: u4 ]! |! L ) H' J K% m; E3 n) c5 }
- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像 ' \& V9 c1 _7 t# }7 k
- 准备Dockerfile
% i. e4 x* ?) H$ l4 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
复制代码 验证7 B" `$ V; \) R$ y+ v* c! ], j4 Y* Z0 s
6 } x1 {# r; E! g3 X- i( z; G
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
9 ~+ y5 `7 q Z1 c* O! z用我们刚才制作的基础镜像随便起个demo程序验证下
6 z% a* g$ v) B- j4 T
5 w' E# F) r1 F/ k; u# l6 W- 已经包含了tools文件夹了,里面存放了我们的tools工具# g: k. V$ A1 m+ y: j; l5 f9 Y% [
2 b4 X9 S# f( @" i
3 k$ t. a- y$ x, s, h: u- \$ H$ m
0 @- K) _5 ~7 z& M9 z/ g
- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
# Y7 n* j% F" g _ $ K0 a! v3 B8 L7 }9 j
至此包含tools的runtime基础镜像制作完毕。
1 R3 I* V6 n3 ?& M! T# w. r$ l. h/ Z, A$ X, s s* j. i
dotnet-dump7 G1 F0 v0 g& x! U% ]9 m- H
; F& U. c% o& x
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致8 d4 c0 u3 {! V3 G, a0 @6 j1 l
5 V/ W+ }" B) L" vcreatedump2 y3 Y& @, p& a* B# |7 _( k" ?. U
6 Z9 v: f4 e5 @# {+ ]
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
2 Y! ~( c" \* U3 t( I2 m/ x虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误: y+ ?1 m' d# b8 b" q, B- H
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
9 b( d$ k) T: \! s8 o0 d7 A开始使用:+ n4 w' q7 B! X8 w
+ M8 M; @" f; @; A: _- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)6 F# O. s3 m+ P2 W- G" @+ P! h
2 X2 \6 y9 r2 l8 G8 C ]
1 z$ }$ e! T0 u& L' j* C* T8 e# {- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功
8 O% K& x- c" t- E - 如果报权限相关错误,可以在你的yaml文件里加上:3 a* y5 K' c' X* s4 ]8 g" ^3 q+ O! E
: q7 ^8 d! e! M, Q
3 w2 b5 L/ M$ B4 K3 T5 v6 [
分析coredump文件
5 q/ w7 d. D Z9 |5 Z5 O* t: }( b; I8 k* i
先将上面生成在tmp下的coredump文件copy到可以调试的地方- ^: u2 Y. \( U: D6 I; X0 z8 X
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
+ p4 B1 E+ R. g$ q m* Q W4 W1 D/ D
, a" x7 U9 W+ t. C% B然后为我们的coredump.1文件下载关联的symbol:
, ~. r" G/ R" P& `$ M; m如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
3 @5 w! G& \. p3 C/ n' p# r+ z
' s4 K, n4 G! D: j1 K: h# s x
# D6 x3 F' L; v+ y! ]- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
* X/ O8 g# ?! Z b( r - sudo yum install dotnet-sdk-3.1
, t5 r! ^# j. h1 T- f' E+ d# y 如果dotnet-symbol没有安装的话,安装一个! @7 z5 S6 q( b& t
# u" r, K" {! ~8 w, N- k5 `4 w ! |9 L7 h- ~ k/ E, f: L
- dotnet tool install --global dotnet-symbol * c9 U3 g. v% Z# j
- 然后关闭当前终端,再打开一个新的
/ `1 a8 r# D8 G3 @ 然后执行dotnet-symbol --host-only --debugging coredump.19 e& i5 p* z) k
* f- j# f5 n% D! R+ _+ K& B! ^8 \# y( \% w
+ o! y# ~! l# N8 Q
- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样3 V+ G% @5 w; O# h3 q( R
( c( o; ~* N1 e6 G: Q8 o0 j然后我们使用lldb进行调试/ U6 q: `1 H" q8 O
% \8 L4 y$ l# d8 Q# p
: o* _- @* t2 l, s0 y+ j2 u; B
- 如果你机器里没装的话,先装一个吧 + ^# B( P" \1 s$ W4 m- Q
- 安装sos插件:
3 [' G. p( j! Z/ \. t7 s! I . s: C/ M2 j# o% M
- dotnet tool install --global dotnet-sos
' Y2 P! P0 ^. i) H( w' c - dotnet-sos install 2 C! P4 q* I8 {9 Z
) A# o. K- a. P d; D5 | - lldb-8 --core coredump.1 ! R0 Q0 k6 h0 A" |6 X6 ?* c. Z- n
- 然后就可以用lldb来分析dump文件了
6 o3 Z4 C( s5 U& k; t% M2 K ) z2 a/ D6 D/ n) r
相关资料:% D# M5 ~3 T0 ^: |9 C8 _
* l6 V5 n& F0 A6 |
: P" c. i4 [: d8 E) x* w
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol
5 Z p) U- q6 a: B& q* P+ Z - https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md
3 m+ ?% K7 A4 a% y$ y9 h - https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ 7 |0 V7 g9 I* P, f$ o7 m' g
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md
7 w$ t, r! ^: e! X - https://github.com/dotnet/runtime/issues/11012 ' E. P4 N( B* S
- 关于大对象使用的注意点以及官方blob gc的实现描述
6 Z3 A0 U2 I; i# G5 u) h. q 以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!' R- ?1 `' ^3 F e/ f/ n
: w J) B' p% D来源:http://www.jb51.net/article/232931.htm5 r7 i0 d+ c, G0 v3 J
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|