|
|
目录& h; e4 M# m( L) `. [8 }
" r: {! v* N/ Q6 z7 `9 O( J
+ w% ~8 K1 I5 j; s; Z8 D- 安装
* \: H$ f$ L" U7 T+ `0 Y s8 p - 验证
+ A8 q9 S, X/ U, B2 u- Y - dotnet-dump$ i+ T9 Q+ F& h2 q4 P: Y; z
- createdump& H/ t# ~; i1 L% Y" \# a
- 分析coredump文件
* e% h6 @" I' H3 J - 相关资料:
1 T& \& ]- F2 e
* v, w) n) {) N; y$ W安装& l8 ^, Z. G, d: g7 N, o8 }' x
" r0 g8 G- V$ g V6 n5 R7 k
. ^/ j F% V# H- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像
7 a" X0 K/ G2 t - 准备Dockerfile
. t6 P0 t0 H6 F. U - 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
复制代码 验证
+ D/ N7 |/ ]& U4 F; k; ^ o+ G; D, L( [. G! F; L, Z( C; \
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
3 @6 w. {9 h- Y1 a9 L. r+ d用我们刚才制作的基础镜像随便起个demo程序验证下5 |, G3 N4 A6 f* b
, h2 |7 B( P( O. w1 y9 c- 已经包含了tools文件夹了,里面存放了我们的tools工具
, [0 }7 d4 ~8 r' R8 s r: ~ . t. ~8 j. g( o+ s- G" k
& m& ]5 U Y; C& E. J8 g# M
$ U" a1 @/ P1 H- O- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)2 F& u0 n) B; ]
2 L/ V- J( V* c: @& P, Y至此包含tools的runtime基础镜像制作完毕。3 F* K0 C7 J( h/ i
3 D" H2 y0 o' q) w
dotnet-dump3 o8 D v) Q6 u$ m4 }( X
, Y' ?% n9 y6 d3 {1 }它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
" h8 n' G2 p6 v9 D& E! ?' E
O. D8 t% \" F7 Z% acreatedump
0 H; f! K* K9 o! L; W- ~
/ v4 p5 `) R1 \6 D2 P" b4 i6 s它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法% P S. H$ O$ }
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
2 A8 Q* x6 d$ I* U这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
; U6 k3 x5 O% ^* X1 ^开始使用:
" H+ l4 n' {9 U8 H* V2 k2 L
. l6 f) n% x, O3 [- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)9 W* t- \; a6 W/ W. F' N
; [. r6 ^ ~ `& P8 U+ l1 V- }) D
: S2 y7 e. K; J+ k- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功
% M6 B9 o+ p, q - 如果报权限相关错误,可以在你的yaml文件里加上:
( }( @+ x6 l8 ?1 d3 \ e 9 u* |' F* G7 p( m4 V1 n
; k9 v" ]; V, o) X) W分析coredump文件* ~) \6 Z5 P/ G. `$ m1 Y3 K3 N- Z
4 I! s3 p5 k0 y先将上面生成在tmp下的coredump文件copy到可以调试的地方1 h+ W1 N$ L. d7 t6 g- g3 T
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
, m1 u- x, D4 v0 b5 U8 e6 }/ y6 ^/ t. U% Y- d
然后为我们的coredump.1文件下载关联的symbol:
; M) t# e( E" I" ^. @% F如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
& H" r1 I, {8 A6 q* M3 z- K
m- u8 k7 E. E; D6 W
3 l$ n3 Z5 E- |* I! B- Q- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
$ b5 v4 A' r% M - sudo yum install dotnet-sdk-3.1( c. O# g9 n4 y! D+ z& [0 D- Y$ I
如果dotnet-symbol没有安装的话,安装一个- A* a* @! ~4 n* [3 ?3 O' k1 K9 o+ }$ Y
9 q/ A8 m; r, I6 m, O4 X1 ^$ } : Q8 b( D; ^0 F/ A
- dotnet tool install --global dotnet-symbol 6 S6 A6 }7 S; X! N/ T
- 然后关闭当前终端,再打开一个新的 Z& e3 q6 |7 v4 N7 [* U- g
然后执行dotnet-symbol --host-only --debugging coredump.1% X; E) n; ~# U K1 l& b D* a5 _! N
; M0 ]6 j* ]- ~0 D" T
; a: B7 }7 n* t' V& x & F7 T. C, T) A1 ?2 L! D1 w
- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
, ?. F) w: c9 {5 r$ U 0 S" X+ f. v* z" C
然后我们使用lldb进行调试5 p6 [1 W( }- n' o+ M5 F( d
- @3 I( F: _1 J" x6 L9 v " ^6 h! e: v( t8 @: R o
- 如果你机器里没装的话,先装一个吧 : n2 `' I' E. t( i* |* q/ n
- 安装sos插件:
0 N7 [+ Q; F# Y7 {4 W% H2 g
1 T4 ^' t1 `; {) n# b" B8 l4 m& H- dotnet tool install --global dotnet-sos 8 s$ C1 \/ y# L) A
- dotnet-sos install
\/ I* m8 C% [* \6 w
3 E! `8 ~/ }& q; I7 _ - lldb-8 --core coredump.1 ; D7 P" J, B4 q9 M8 i
- 然后就可以用lldb来分析dump文件了
! Y0 p, w/ E. P- ~) |, t) | . @' ?' W# r' ~! x" k! v$ A# D
相关资料:0 Y1 N8 e* D7 x* n. p k& {
- Y! }7 ]8 x0 {- Q* N - V i- y0 B- D6 _2 D9 K. [
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol
5 e/ C6 }6 A5 q6 N$ f" x: i - https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md
) c/ m: k7 D2 Y7 X8 M. S- ?- @2 ~ - https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ # [ ?+ b" m% [: s
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md
, A9 l$ d9 L( L5 n - https://github.com/dotnet/runtime/issues/11012
* y. I! Y1 d# l' W: l - 关于大对象使用的注意点以及官方blob gc的实现描述
" q6 m2 s1 W+ @% t5 ^ 以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
6 O/ M7 ^3 J* F, ]$ y: Q m" h! g
4 z9 `5 {# h* H- _来源:http://www.jb51.net/article/232931.htm
( A8 v' T) V% c8 W V0 C. h! J免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|