|
|
目录* w/ q' o3 s4 V3 v6 S
7 F, t. H9 w2 U5 A; Z( u) {) ~5 P% R \ g
- 安装9 K6 V4 `( E- c! m5 {# z" q8 ` C
- 验证
% K2 e3 V1 k& E - dotnet-dump
. R3 { C! p0 x4 `1 J - createdump
' x& h/ \& p K3 q# u# \ - 分析coredump文件
; H$ M& u" Q) m/ ?! A' r - 相关资料:7 G: y" e% j6 V- ]% L' C
$ ?) H8 ]3 O; h* R* ~6 E; e" g. N
安装7 c+ r! @2 Q i
* H8 I' I' k( {9 M5 \# N% y$ \
* ?+ \+ k# e& X% W
- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像 6 }, e4 z O9 X% p# A
- 准备Dockerfile6 a; s4 {7 y9 @# E* @* q
- 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
复制代码 验证2 g: }$ P# d, H6 R
1 Z+ i! Y& q, b; y) r3 N7 W5 T* @& L基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
: B: S$ W( b/ W" ~9 h6 i用我们刚才制作的基础镜像随便起个demo程序验证下/ i. ]6 u; G7 {7 [
) g6 c8 o9 g& b/ N. O
- 已经包含了tools文件夹了,里面存放了我们的tools工具
1 ]7 @* P, C0 I* x# o" G* _ 8 d C' L5 G: G; D
$ ^* F2 o) B* ]5 M
% X% ]0 s* s; H9 o- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
9 f& U- r* a* u% U- y3 n2 ~
' b, ^- N. R0 s2 Q至此包含tools的runtime基础镜像制作完毕。
2 N" s* z2 x q5 a1 m u( \0 I3 u# v
* ?2 ?+ d7 d( x5 I3 Udotnet-dump/ M& Q6 u I. Q' |# J
4 F3 v6 V# q) {! N1 V' s它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
# S$ s) i! z+ b+ a+ z
y2 M9 \8 ?. ~! _; Ucreatedump
4 ^# M4 {' ^" v L w' ?0 y' {- P# r
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法# [+ `& i4 H3 W9 c# }: o
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
& f, z6 d$ q+ E这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下 l. v w8 F5 @
开始使用:+ ` {4 }' F6 J6 p: }1 L3 N2 W j
: T( X2 Y8 \9 R7 l" K
- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)* ^) m1 m: p' Y7 Y8 I
8 Z4 j! J! D Z( d* \ 5 \: ~+ T; O L1 X/ C
- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功
$ T# J) y6 U2 D* M) t7 q- C - 如果报权限相关错误,可以在你的yaml文件里加上:* B! w, j. b; p+ k# e
# B) W& |; @$ R* z& S1 r$ E
! Z2 t% M2 e9 Z3 O$ t7 Y3 z分析coredump文件$ N3 v5 E# @2 t+ K
: W5 c) v9 J' A: x/ w2 L5 }先将上面生成在tmp下的coredump文件copy到可以调试的地方' p+ l. u2 K4 [' ]3 W! o
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
! w r+ j7 X5 a* Z2 {2 d5 x6 X% R w* ?0 }
然后为我们的coredump.1文件下载关联的symbol:
, \) e& x7 ] |3 N+ N如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
' W* [* M- l; i2 ]% X, @$ ]& L6 Q) N! }
4 u% U& m0 v) e! E1 s2 I- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
7 c" l# {( T# U' p% ^+ [ - sudo yum install dotnet-sdk-3.1" a2 i( |' o4 v7 }; c% |" U
如果dotnet-symbol没有安装的话,安装一个
& e( ]$ X3 v1 T& A Y0 A
4 L; o) c) U9 m$ H' G5 k4 m# Z0 { 7 l% w. f( I0 V7 U) A
- dotnet tool install --global dotnet-symbol $ l5 `5 {+ T5 a! W0 l( l
- 然后关闭当前终端,再打开一个新的! Z' d* Z* I; I: A7 l
然后执行dotnet-symbol --host-only --debugging coredump.1; ?) m- h5 H4 z- j7 `7 Z
% z" k- ]9 b: x# V3 n
/ R: A5 v- }. Q9 b u! s# C" f
/ X! {' y3 V9 B- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样( Q1 E+ @, P7 Y7 D
7 P7 J! V0 A) \4 a/ V( t) b
然后我们使用lldb进行调试
; |% o; x/ r" j
8 g4 R* U* T( N/ q$ j5 D: r
/ ^ @- ]4 B% z. ?, p! c- 如果你机器里没装的话,先装一个吧
5 d+ f1 R! J1 i& D( d: v - 安装sos插件:
9 y: v+ Y* e+ d3 U) Y0 `6 s1 T9 y
) m2 G$ q5 ?- c. J( K u- dotnet tool install --global dotnet-sos ( T" U( X& l F3 n0 K! h
- dotnet-sos install
$ O. C3 T4 t, o1 r' u 3 V9 B* `3 Z6 A+ ^9 r
- lldb-8 --core coredump.1
5 O r7 H0 d8 A7 I$ U& E) i/ C1 N - 然后就可以用lldb来分析dump文件了
$ D' ~, F! [+ |6 D$ ~" K8 p
% l# w! u% U! g m' z0 ?* D相关资料:$ D8 ?3 u. G) x& L6 q1 [
- G3 b" \ ^3 i4 a. V U- F2 I& S
3 L% f' D& f! \/ Z+ v- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol ( F$ \+ E) V; w% q% P; g1 [ \
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md
) p" `" q3 f8 s& w - https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/
+ n7 Y- f2 \! c5 e# J - https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md
9 j: m9 B9 e. K9 _( `6 s - https://github.com/dotnet/runtime/issues/11012
# Z2 H2 ?0 |/ y - 关于大对象使用的注意点以及官方blob gc的实现描述, a3 t( X1 u; }% O7 a& P
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
: ]9 _3 j; C3 \* p7 M; ~# m
/ Q7 K) L4 V. E来源:http://www.jb51.net/article/232931.htm; o- s/ T( v! g
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|