|
|
目录1 V; W9 ~0 ]& w' e1 n
9 v5 x* }* {) d7 D
& k/ \4 S+ @. N! Q4 F9 e
- 安装
$ R& m6 d" G6 s# A2 Q - 验证& {1 C4 }7 k3 F- ]4 ]. Z3 j1 H0 K
- dotnet-dump
! L( e# g7 t6 B6 b) V - createdump* \. f9 E. N. ]* l6 J& z
- 分析coredump文件
* k' q( G n4 t; _2 @9 o - 相关资料:
! z8 ?/ [: }6 e+ {/ b0 f
% F* O) C) g( e8 R安装& p& d4 p5 h9 N' E3 f5 _
1 S2 p# D e9 O* a( o& G* U
" ?" {. L/ {. A2 l6 K- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像 * n. `5 |- j; V0 `4 j( [' i9 m6 m
- 准备Dockerfile
6 {5 C4 E# i. x - 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
复制代码 验证
) {5 G z6 z0 V+ h E4 ?4 _8 P& Y% w4 [
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多( l2 B9 W2 I* F
用我们刚才制作的基础镜像随便起个demo程序验证下
# T. W5 E7 a" }7 } D* ]' K& } ! {5 _. U2 X* x A2 A& l
- 已经包含了tools文件夹了,里面存放了我们的tools工具
; ^9 [1 g- w: b( u: N
8 y. d6 P O8 [9 I
( V& i- e# `) D7 v/ M( v" O - S" M% A# g, O: P8 J5 e; g/ O
- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)" R, w5 z: u) O8 |, j/ c
9 E2 r ]& [: i
至此包含tools的runtime基础镜像制作完毕。& o& h* D% n9 m1 ?1 M. C$ s" b
4 B$ y2 A3 ~0 K, p; R8 Odotnet-dump
, M, i& j* ?/ d J0 R2 R
* P1 i( O9 G& q它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致7 o* C/ ?' I7 n' H9 f
/ Q, t" z v, b1 e7 `# |
createdump
1 z9 ?$ t) T7 p9 b) A8 G& K/ Q" I- r% w( f& g' ]# S
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法6 k2 {3 @1 Z/ D" n9 N
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
5 P+ S" z/ x. y: l s9 U4 E这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
. c/ e( f* z+ v7 v8 r" G7 G% C) o* j% z# Z开始使用:, f% L# p: z$ J4 T' @
/ p' \+ R: V1 Q- [3 M" T! {% L4 F2 l
- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
& F; z! }' k3 R/ I5 ]
0 q8 r8 \0 f' r : d1 E% H9 f+ C5 }7 b2 v
- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功
( d7 K+ i3 @ b( c - 如果报权限相关错误,可以在你的yaml文件里加上:
9 [8 H. y. g5 l( L: o" n
3 `8 s* ?6 W/ n! v& j& W
" B. F5 G/ m4 j: O分析coredump文件
W6 }' U0 t- ?, A, M* @! d% w; N9 T
先将上面生成在tmp下的coredump文件copy到可以调试的地方; `' X9 [/ l4 Z0 K
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s% H4 e- k6 A$ @$ R8 m4 T
5 Z( ^3 d2 J; f" N, R
然后为我们的coredump.1文件下载关联的symbol:
: u! s4 k& [9 o x' P* ~ I* e/ ?如果你准备分析dump的机器没有dotnet sdk的话,先装一个把& e1 f* {7 C8 C
8 ~2 O8 _) L5 P* R
: ?& A# b, D& Z: a1 N- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm 3 ^" W+ p: w4 t, y1 {( {1 G
- sudo yum install dotnet-sdk-3.1: _. P- F: R" [9 R* b3 d# _/ a
如果dotnet-symbol没有安装的话,安装一个9 }: _9 A9 y2 b
2 d" w4 G% _$ R, |
A. {0 ^" Y6 N" w- dotnet tool install --global dotnet-symbol
2 G: h# R% {) m! ` - 然后关闭当前终端,再打开一个新的( `' o% ^7 @' Q8 z
然后执行dotnet-symbol --host-only --debugging coredump.1
+ V% a, n$ k6 R8 S0 [8 ^: S3 X" Y7 O; o
3 V9 k S) y: \' p1 a
: p, p( h9 }( @6 K$ a- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样, r7 C( K! z, U" m, h% D4 w& h" O
: a) t7 D5 B+ v5 ]8 W L+ C
然后我们使用lldb进行调试: _2 n) s2 h& e
: e" ]* Z3 c: D( }* o: ~8 v8 B * }3 k7 @+ y. b; d! @1 T1 U/ C
- 如果你机器里没装的话,先装一个吧 7 X3 c$ _8 E8 A: m8 H z$ M
- 安装sos插件:
. s7 [1 ]& W7 G A+ ^" u: N ! j: x u4 A! o3 q* O$ s
- dotnet tool install --global dotnet-sos ) l7 Q t! |# _; {
- dotnet-sos install
2 ` [( d2 }5 A7 Q8 w1 `0 k/ E2 K4 d8 ?
0 D# q: \& x. Z - lldb-8 --core coredump.1
9 T. B$ U+ w) C8 k - 然后就可以用lldb来分析dump文件了$ L( L6 F* k4 `' ^' R
# T z6 G( w% K& D7 H& N& @
相关资料:1 H4 [! j9 L. N M5 R# U, r0 E
# n* [0 r# D k9 @" K
: A: S X1 E. H3 Y. }: A$ [6 k- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol 4 @1 v6 b2 d Q; y+ ~& Q1 T
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md
5 u7 w+ r- M: c" b$ v - https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ . h% v% s" e. V/ C7 ]
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md 1 i% d7 K$ c/ x5 k
- https://github.com/dotnet/runtime/issues/11012 , Y/ E3 }' Q% A, F5 z/ a
- 关于大对象使用的注意点以及官方blob gc的实现描述
1 S4 A! C/ @! _: v0 m. |* ^$ t9 i; j 以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!! |! h( u$ P5 o2 L5 ]3 ?
1 ~3 }7 h# Y8 U
来源:http://www.jb51.net/article/232931.htm7 @0 S+ N# K4 K) P; n0 k7 e
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|