|
|
目录
6 F) T, F- a* }' M$ Y- c# T- i
( _; X% O- h9 l& `, K& O! K3 L0 I% |. M- X; p" m
- 安装1 T4 c: |! [) @7 l A
- 验证1 M' i4 d$ y4 `+ v4 i0 U
- dotnet-dump
9 i8 J5 N2 E; V0 O7 A - createdump
6 F8 W! _' I5 c6 G. G4 n+ m - 分析coredump文件
; @3 I; @( `8 P - 相关资料:" B6 ?/ R# ~* o" q. C7 @
% z) V: N$ J5 z- D
安装
) B* `; L7 d4 w4 P) V, R) }0 h( {1 \. V7 s
( G5 _6 ]4 @8 J7 m- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像 ; w3 Z, M' K* F. a9 r
- 准备Dockerfile
7 x7 u9 u6 [/ N6 F9 R# ]* K+ A - 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
复制代码 验证
$ G8 n8 @* F! _% i- Q) L v$ p1 A! a+ j& N( u3 @
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
0 O; m! `4 [. C用我们刚才制作的基础镜像随便起个demo程序验证下7 f6 b2 m5 m7 F3 @6 a
. ^2 b7 J$ e! G8 f1 H1 M* T* e
- 已经包含了tools文件夹了,里面存放了我们的tools工具" y1 n% A7 M j( M* k" S0 e+ v
6 Z) f; _7 i0 I
. l \( s6 |. E6 f ; t: g( T* V4 Y& q
- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
- ~9 Q( ^9 ~1 m3 S" P& x: ?
7 S5 Y6 }5 B1 }/ e+ z. C) H至此包含tools的runtime基础镜像制作完毕。
# N6 D, z. v+ C' n' i
) Y! v% M3 h: G9 k/ [6 ?# i7 vdotnet-dump
# E( r: O" n: c+ P, y( e7 r3 m
" m" f% o/ n' |; f; a! E$ Z) ^它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致" R# @- {3 w0 }$ g4 g5 W
& \3 b; ~5 O; ]% S& Q; n( T3 Ucreatedump
4 f. Z; q" R* k! N8 O! K8 O# l8 ]; @0 e* w
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法$ @$ {2 m7 q4 Y3 c5 Z
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误# f: e0 j2 K( K
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下/ N& b8 k5 s f/ @) w9 l
开始使用:& }0 l B9 w! E* {- U, c6 m
" V2 m7 r" v5 B& c1 m0 B2 b% [( E- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
- @ ]* |( H( |4 G, R4 Q6 I0 V
9 Z' ~% R) {! Z1 U+ g! i % @3 t3 g6 |* }4 r z5 n
- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功 ! [5 H$ V' |+ n3 c; w9 V
- 如果报权限相关错误,可以在你的yaml文件里加上:
9 p a% W. l2 D% { 7 Q) }, \# q- y# m/ N
! q S/ G9 T7 |# \" J
分析coredump文件
6 } e) p' {8 u1 C% n
. a; T; |2 A4 ^2 a0 U) s2 K. j- q先将上面生成在tmp下的coredump文件copy到可以调试的地方
6 z9 e. l3 s9 C- X$ z6 Ykubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
* t4 N" j% n5 s
* m Q0 w; b6 w, {然后为我们的coredump.1文件下载关联的symbol:
6 Q" l0 c' s0 O2 r: _# X0 L% H如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
j9 f" K6 F0 V' s* v6 N
0 y: J5 D/ W" y+ o {
* M$ _7 V! Y- ^3 l( |. H- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
( G* y. q( j+ w; N" ^' v - sudo yum install dotnet-sdk-3.1$ P) n) M' Z6 R+ k) I) y( }
如果dotnet-symbol没有安装的话,安装一个
# c1 O! ? C# y- p0 p' h h' A3 F" K( r. g
4 x6 E# p- b8 _1 r9 K8 R: Q1 B7 o# c) [- dotnet tool install --global dotnet-symbol
: D7 l) r* l! r0 U$ ` - 然后关闭当前终端,再打开一个新的& U" [" ]7 U( d
然后执行dotnet-symbol --host-only --debugging coredump.1
3 }1 C' ~3 E9 @' y' }' ~
4 o, N$ ]0 w- ^+ [8 E0 u' B' t( t% Z8 w# k( i% g: ~1 X9 ?: g* v4 G( I
% H: }4 l; t! n6 b+ Y9 n- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样- ` V9 w0 w0 E- n- V
8 k8 H9 J: \5 c" y) g( ~' S: s0 B& d
然后我们使用lldb进行调试7 T' J( L7 v3 f. R- M: O7 {
T$ s: Y$ h/ H ' ]& e4 P- j5 v
- 如果你机器里没装的话,先装一个吧 6 ?! D% Z+ p& e* z/ b2 ]
- 安装sos插件:. ?* F2 b f U. B% d3 T! N5 ?. a' }6 T
, M" p: U3 c, L- { l# d0 o0 E- dotnet tool install --global dotnet-sos
' x5 k2 l# u: V# n - dotnet-sos install
$ A" b7 N6 J6 h% v
- }0 \7 R. l9 l, ?' \ - lldb-8 --core coredump.1
/ t& k6 ^! p; { - 然后就可以用lldb来分析dump文件了9 C- F6 Z! S L. X5 J0 _4 ^& u
* ~; h: F+ p! _5 c. I0 k, _
相关资料:$ c( v9 U/ C- H
# T" U- A$ w2 A7 w - T9 T8 p2 H* i/ s, ^& y/ U
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol
9 }; }" c) R; a( W' e8 [ - https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md ' V. b3 W0 a j$ B
- https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ ' a3 z8 L. ~1 k0 n
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md
( q1 a: X: L, k - https://github.com/dotnet/runtime/issues/11012
y" z* l* l1 w' a& M! q/ C - 关于大对象使用的注意点以及官方blob gc的实现描述* k$ D- z- A- `6 d- e. ?" u
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!9 i5 {- }) e" @
6 ^% Y& {& U* ?7 R: Z来源:http://www.jb51.net/article/232931.htm# {, \* X8 L& h7 B- h3 h S1 |
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|