|
|
目录
& N* r' h+ ? A+ l( H* V7 d" T5 e k- {! g2 F" Y
8 W, c! g' a0 ?* [: l/ m- 安装 ~# |& `) ]& f' Q. H) k
- 验证! u6 `8 ^2 [+ `
- dotnet-dump; A% N6 \5 j2 V2 v9 h0 |
- createdump9 V8 Y/ n @3 [: h# t3 _% I( `
- 分析coredump文件, z% l; ^/ V4 j
- 相关资料:
2 J* ?3 U/ J# _) O6 X4 e
: S& x! C4 A/ B! U+ Y' N" S5 U安装
1 j% z5 U/ G M+ A1 o: `$ N/ H
0 e. _2 z3 L$ W; D . n0 t' a& s5 U% |( W! i1 |) q
- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像 : `' j) T* n# x! d
- 准备Dockerfile$ I$ j4 y+ a# a* n* G q8 ^
- 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
复制代码 验证. p3 ~( M& D0 a h* ^+ {
" o: \' g, p/ p- {3 S+ U基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
2 } c, O" K- j+ n, i% w0 R1 R+ w用我们刚才制作的基础镜像随便起个demo程序验证下0 J) A8 p( D% H
% |* D& s4 _2 f& \1 d' L0 ^7 B
- 已经包含了tools文件夹了,里面存放了我们的tools工具
: r/ f P. t% @; b- |
4 o* f5 O8 P& d2 ^; T$ ] v$ A9 w b4 Z& d' G3 L
( g1 A! e( Y& n$ T( j' @# w5 H% m- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
2 G) y! P# G" y9 j
1 n0 E3 c4 i: d至此包含tools的runtime基础镜像制作完毕。/ @, N `0 R. ^( U" j+ f! S) j& a
; a2 G$ h7 r! O/ _dotnet-dump
2 Y- Z5 t6 V. F" j7 x/ \* S3 E2 t6 ]. x5 e( F+ s: c4 ]
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
2 ?' v- u) `& T. p6 e8 Z
$ p6 L7 n8 _4 A' }createdump+ a8 b e1 }5 H( M) D
: ?/ m9 @/ L% ?1 g8 q, o' {
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
) `( b2 F) U" i$ u虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
$ D. n+ [: v( V" H; w这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下$ d% P3 z* _0 {9 i# j; s8 P/ X
开始使用:
- @3 y( w/ s( L9 E 8 @* e+ U! v( h. _
- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
- {9 h" \- T5 U! a; k ( w- j) c/ [/ @4 q# ]3 H& j
8 ?; @! g6 x9 z+ G' ]0 A. r }
- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功
! R6 d- J5 D& g/ H - 如果报权限相关错误,可以在你的yaml文件里加上:( g) s$ W+ F, E9 Q
" W7 g) x+ t# A! j& z
5 {" l- }, |8 A: y" {( A分析coredump文件5 i8 }2 \. y! Y, h: g, Z5 E
' K( Z( R9 h. n
先将上面生成在tmp下的coredump文件copy到可以调试的地方, F/ i0 ?( n% ]2 y4 X3 g: ^
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s u0 W. T+ }7 z3 u
7 j: f2 f3 G, F0 O* m
然后为我们的coredump.1文件下载关联的symbol:' e: ]" C8 `1 T2 o# q2 M- ]+ B
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
: B& U. o5 j$ O1 M, N. |0 u8 a, G0 [. I" @2 [( `5 b
j8 I* ?8 i( K/ [
- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
1 t/ Q5 o6 M4 n- {+ y3 v+ { - sudo yum install dotnet-sdk-3.14 x) D* m" j& y& |9 i
如果dotnet-symbol没有安装的话,安装一个
% Q, H& z0 h+ j" X. H5 D$ c" {% B- M6 N8 O8 W
2 D5 m2 H9 d: a' X7 X( O8 b- dotnet tool install --global dotnet-symbol
8 L" W, q: A9 V0 @2 {2 K3 r# y - 然后关闭当前终端,再打开一个新的
_) X6 v1 y( a- s, j/ B" G4 a! Z+ j0 w5 S 然后执行dotnet-symbol --host-only --debugging coredump.1# H5 p/ ]0 I6 W5 @; g
3 B! l2 z* B! P. \$ s3 D0 N
) w7 l# _6 x x/ q. i# b
]/ L# K& k5 N, V% C- |- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
! y4 B5 w- M& t" Q& T 3 J$ k# L. l' _- S& v
然后我们使用lldb进行调试+ P, ~; c8 p* A# Y7 N7 U
) J; V1 |; A! \+ m 7 I: s; ]+ ]* q
- 如果你机器里没装的话,先装一个吧
2 ?7 s. G. V# V _7 d) k; [ - 安装sos插件:5 j9 Y% W& C$ F+ |) X! k
0 u: _% _+ O B2 t* G( J" R
- dotnet tool install --global dotnet-sos
9 O& K& @. W& U2 W - dotnet-sos install , ^! P* I/ r& F7 s# y- O7 o
; ?; f6 {/ O/ n - lldb-8 --core coredump.1
3 V: z4 ?! a! ]! F. w) L) o4 [ - 然后就可以用lldb来分析dump文件了9 y: p/ p" F3 M& S- `2 d
7 B1 j. W L8 E; M
相关资料:
. `" {2 e* b, _; @6 S
0 B& _7 e. H+ K5 L6 i " C0 R! r- H: Q: A) a+ m" }
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol 5 Q$ p; S" N# K8 R0 I
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md 1 |* |5 v- E- x4 O& l: p, c
- https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ 7 L9 U% e- E* g2 n5 ~
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md
2 i) M. E' K* T0 @ - https://github.com/dotnet/runtime/issues/11012 / I5 R1 w$ Y: k7 u+ E3 |
- 关于大对象使用的注意点以及官方blob gc的实现描述2 e- ~6 i1 I" l( I, {) S
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
+ @( U; a* ]! r. h/ d7 H3 r4 _/ {$ L) R
来源:http://www.jb51.net/article/232931.htm
0 H1 \# [6 e8 E免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|