|
|
目录, U- _ G$ V1 p& Y
5 ?, D/ _) t0 Z' d1 d
( L2 _; @ Y/ G; ~0 |- 安装/ A) j1 f8 ~( Z R
- 验证
! k* @$ I! a4 A, u$ K2 l' X+ f5 ? - dotnet-dump+ K7 U3 l* s: ?% Z" m' T4 l5 P) I
- createdump
3 n% S+ X4 z x1 V4 T - 分析coredump文件
" m2 X! y/ h& h - 相关资料:; Q8 Q! y# S2 l
9 }, p2 c4 S( ^. y6 y2 W- J8 O
安装
& f3 g% O7 u5 C- N" h( q9 G: k
: |: Z3 w: ~% m
8 F u9 Y; t4 U- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像
. l& x, M7 B$ h) t$ v, v ] - 准备Dockerfile
: f6 W+ E7 C4 |8 o; z - 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! l( j ^/ {) I* T# Q& {6 g, H7 {. }/ j
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多. C) A* w" x0 F3 S% o! L; L) b
用我们刚才制作的基础镜像随便起个demo程序验证下* j3 K$ ?3 g/ o, T1 L( Y
8 m+ H5 w. y3 Q h0 V
- 已经包含了tools文件夹了,里面存放了我们的tools工具% P) X9 {. H! E/ T; m, D" u
2 G; B+ h" N. ?8 D
0 }- K8 X) Q& `8 F9 e 2 ]* E; g5 K/ g3 L8 M# A' R
- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)/ N( ?, j% k b; S, P# B3 V
% m+ d) k6 [* X" M" Z
至此包含tools的runtime基础镜像制作完毕。
: ^& N( s5 D; P* B
0 x/ L1 @$ O6 Z$ Hdotnet-dump
' A: f( O* d2 N" G4 E& c
' C9 X7 [& t- N! i2 L( X( A它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
5 _' [. z: N( |" w! [+ c
2 U: P/ Z& r$ D" |createdump
' x5 L I4 @% d0 R+ v3 g) |/ s. j. |. u0 n; F0 |
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
/ P7 b- ^7 d5 g: i* b, p" E3 D) H虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误& i1 y# K4 H( g8 p* Y4 i* Y1 h
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
' K% F k! y9 T7 ?# b! p0 j H( r开始使用:5 _( O# }. P* o ^! F1 i
/ D! v1 m) N- n( D4 [; y- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
) m# B+ o3 A; I( c* C0 U
2 L+ ~+ t' O6 I3 @8 V& u: L3 p ! {4 Y/ U. W5 C/ m; d
- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功 " T4 e( ]% w+ [$ b! V3 E
- 如果报权限相关错误,可以在你的yaml文件里加上:/ W* V, B- v3 t- z& I
: F7 }# E% P: k' {$ ?& m) G: t; f4 W4 j9 k3 l+ T
分析coredump文件+ K: K Y$ d2 G% a
# R8 ]. \5 }& z
先将上面生成在tmp下的coredump文件copy到可以调试的地方; K, l4 ^! \3 o- a! Y
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
1 m: e0 o! P a7 a, k6 x& L+ f7 @" ?7 d/ Z4 F- N
然后为我们的coredump.1文件下载关联的symbol:; }( L9 y8 ~& h, C5 a& `1 R. q
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
! F# p( [3 a* |, `3 f0 ~4 f
4 S5 f: o7 J+ L8 f, G
+ Y: Y) H* e# b/ G }$ v( q- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
2 q$ G8 g" f+ q( c& ?) w - sudo yum install dotnet-sdk-3.11 n' C+ D+ x1 `: z& W3 ~4 J
如果dotnet-symbol没有安装的话,安装一个
e" b* f2 [$ V# @3 d* {
$ f5 Y. g3 r6 E/ Q) v& Y( l; M
2 W, d$ b- C, P" Q+ D: h- dotnet tool install --global dotnet-symbol + z. ^. K* d7 A
- 然后关闭当前终端,再打开一个新的' ~+ b# k# G0 M) J' x9 R
然后执行dotnet-symbol --host-only --debugging coredump.1) h: ~0 l7 X; m+ q. s
6 R2 O4 {; V2 a* O9 R7 n
. g0 Z; b* G, Z+ ]# a' D
7 V: p' F# s- V w+ D- A- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
, u9 x# P$ V, c: T ! _7 }) I2 p( F% [0 `2 O. d: }
然后我们使用lldb进行调试
( B/ I3 t) l- h, e8 F( C$ H* e ^0 ^: H- ]
0 p3 v: M8 `" g) w: Z1 O% J- 如果你机器里没装的话,先装一个吧
9 {9 s9 J1 [9 k( F - 安装sos插件:9 @6 O& C" F9 p( p
7 b7 ?& w. j/ t% r9 o8 c M- dotnet tool install --global dotnet-sos
! ~0 u" G; I/ n5 n* u( p - dotnet-sos install
' V* H( T- ~/ U1 h6 p7 e& A6 @! B9 B 2 l2 V6 D1 Q, Z/ j$ F" S
- lldb-8 --core coredump.1 2 M, P+ B, i J- O ~+ k+ V
- 然后就可以用lldb来分析dump文件了
+ }" Y1 q) o" `! d* G( |' L( c. l$ N
% g0 ]1 H) r/ z0 p3 s7 C相关资料:5 |* s( C) ~ [- y! \+ p" K
* V6 \; }5 x( d& `
" Y; e9 X7 E8 `, w# }2 c; U- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol $ j2 ?: y# X! Z. _5 T; e+ U
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md , D, G1 F2 T$ i2 I3 r
- https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ ; d; s: U/ `0 n# M) N6 D7 J
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md ( |0 b% y: f0 z9 D6 O1 }2 n
- https://github.com/dotnet/runtime/issues/11012 ' v5 L* {9 r1 ~, C, J
- 关于大对象使用的注意点以及官方blob gc的实现描述
) W8 f, Q9 o; |4 T# j4 Z8 P& \ 以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
$ W: t% R) c' c( z# B! y
& k6 z/ K& v+ |2 E: x来源:http://www.jb51.net/article/232931.htm
* T3 j+ r. Q( V5 f" W) d1 I' m免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|