|
|
目录
5 L& k/ x* }. e2 e1 F9 _! x5 K# j: n* t" f; s7 u { d
; B8 m L( n4 q- 安装
" p7 x- F: {4 u& _. ]7 ^ - 验证
1 J8 k& |1 h8 x8 I& d! {, V - dotnet-dump
8 E H2 ^( R0 a" f$ _+ v k - createdump
' W" w: k5 X8 f, V L x' N2 V - 分析coredump文件) w5 v( P. B6 S- m# D# K i
- 相关资料:" a- j, y- o/ X9 m! w+ S
$ c# y/ D( \7 s( Z" c! I
安装
% Z. Q* |* Q9 d" v( W. b5 u0 f% S; C z+ F+ S
% }+ [, e. i7 b; S" {1 e
- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像 # I4 U% ?! U4 t+ @( i" c3 K
- 准备Dockerfile1 |2 ] x L6 ^ @+ f% ]6 T
- 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
复制代码 验证/ J1 g. |, \3 X! n' r8 b3 P+ @
5 R% z6 y# O T x$ U
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多7 j2 v$ x0 T0 Q, F
用我们刚才制作的基础镜像随便起个demo程序验证下( \0 A5 Y9 E% R) r5 K! H0 M* V, P
' U# C* F* B9 \; o4 e( v
- 已经包含了tools文件夹了,里面存放了我们的tools工具' s6 C6 h8 u1 C2 c
t' e; s, M* ]6 B4 }- a; v4 T7 K5 ~; l/ L4 z. F
f {8 R/ y( w( {* T$ I/ a
- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
) }8 ~7 I" o; ?( R, o , P7 Z! J& y. p9 g; I
至此包含tools的runtime基础镜像制作完毕。/ h5 ]; N' Z. s' Q2 `
( u* E2 y8 u3 ?9 _8 l+ l
dotnet-dump
" s4 d) l# I* \ d7 ^- l( Z9 U( L7 f+ v$ x% L9 q0 Y
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致8 T, a/ W7 S7 u( F4 l. @
! g) V7 n* o. |% c/ ]1 S2 u' k5 a1 |
createdump
. U- m7 [- g1 N( }) I7 V8 i. t' G; P K- {! i
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
% d( W* i1 h0 ^" q8 e; V虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误) J2 g4 W8 D" P9 h
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
7 J" {6 U( A4 H8 w4 ]' j5 R/ t' C开始使用:
1 r( ~0 Q# v7 v) y3 \2 A; R& k ) m/ `) i( l6 ?' x7 W3 @
- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)3 P/ ~" w7 R, J9 r G& `# U+ S' A2 V* J
; p4 H3 g9 f( i' @8 j' l: i
9 `0 v* @7 M" X2 f5 p0 H- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功 9 X. N+ f0 d, P% }, u! r
- 如果报权限相关错误,可以在你的yaml文件里加上:
# ~6 ^0 e1 }. T+ l/ s6 ]
' Q4 D" F! O/ e7 y: v- K4 p; ?! j) T" S) b2 o
分析coredump文件/ K3 F/ O* F) h) S Q
) I% F! o. a6 N1 X: N& h7 @先将上面生成在tmp下的coredump文件copy到可以调试的地方
$ v R0 e. x! _) b3 c5 _- N P! Qkubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
( U0 H* Z. Q1 O8 L2 M
+ a R! s S& e4 _4 Z7 j2 T$ ~然后为我们的coredump.1文件下载关联的symbol:& V* d b9 E2 Y1 F
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把5 t$ t8 q7 g+ c' }, o# I8 f
! n C5 x6 ]- q: ~
9 X, ~; m' M( H# T- A5 a- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
! z1 T9 o4 s; V& t4 k0 A) j - sudo yum install dotnet-sdk-3.1
! N! \ F1 a. G% { 如果dotnet-symbol没有安装的话,安装一个4 ?' p! }0 T$ v0 s
7 L) w% C% }" d4 i
. M( g4 V# I! I) Y* x8 m- S- dotnet tool install --global dotnet-symbol 1 u6 A. h3 h$ B' ]; [. Q! b
- 然后关闭当前终端,再打开一个新的. B' g/ g& C2 ]7 k6 q
然后执行dotnet-symbol --host-only --debugging coredump.1
+ K9 j |5 _) Z1 ]+ N
2 Y v* R; r# Z2 Z# r
/ D% v! R. m( ^ + ~. T' ?& A, f& P: u! ?9 x
- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样 o; z7 x* _& E$ p, v
) \0 B' i4 w9 Y7 U
然后我们使用lldb进行调试
/ m7 C% `' ?2 M& o
9 t3 L: l9 R1 N8 A
; a: ?% }% X p7 o1 E- 如果你机器里没装的话,先装一个吧 # B# X/ j8 n# Z+ r
- 安装sos插件:- P: V, P. M5 z& I
; ~. n2 u3 |( ~ ]& _* _, x- dotnet tool install --global dotnet-sos U+ q8 C. W/ @9 E
- dotnet-sos install B0 a* W# z1 V5 ~$ Q$ c3 v/ T4 P0 H
! k8 o W2 s; ` - lldb-8 --core coredump.1 4 n; h! h( d$ @( f6 \. ~
- 然后就可以用lldb来分析dump文件了
$ x, L9 o- v% v6 z6 @
4 x0 y. H; Z6 U9 Z相关资料:, N) U% c- v" |' o* _9 I( m
\, J! j( P& ?8 G , y1 ?1 k7 w7 `7 @7 C
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol 7 T0 J0 H9 h4 s7 E
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md 4 C7 x$ L5 u+ B2 ]+ i
- https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/
5 J8 S# T/ }/ t7 `' n - https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md % d9 D! E- a) q: {. _$ w* Q
- https://github.com/dotnet/runtime/issues/11012 u0 q" C6 u9 B; B8 ~5 D
- 关于大对象使用的注意点以及官方blob gc的实现描述: P9 `- H. h7 m7 P& ^- O
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!3 N& y$ r$ f. z/ n
% q b) t. y1 P1 t; F) w
来源:http://www.jb51.net/article/232931.htm$ E$ d' o2 C2 b L J* o& i( ?
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|