|
|
目录
$ Q) C- N. b4 S$ u' W) [7 T
& J- i' `/ A: I+ i/ r- k2 @; ?; [+ q" a& `
- 安装. k( N3 |% D8 Q7 P4 r0 i
- 验证, b' r) m1 Q& c8 X. M4 N! W6 w
- dotnet-dump
: o3 C" y, F) T( `, O - createdump) F+ f1 o8 C5 ?
- 分析coredump文件
" \3 r) Z% k0 X4 i4 { - 相关资料:6 H* U/ ?# B2 [
+ V/ p- Y3 ^% t: `/ B1 W1 n安装" @! |5 G/ U& A6 Y' I& N
0 O( }# }! H9 ~: {& H: }5 S0 ?
9 ]1 M, U0 S$ s3 W" a" n2 N$ `
- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像 % K6 m, V) `, M$ \
- 准备Dockerfile* {' I! C9 c1 ?% t! s0 j/ u* C% m8 s* f
- 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
复制代码 验证
$ w- Z0 c6 l0 A$ J* L; q# z
3 a% V2 q3 R+ i2 t S基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多# d9 Z; a+ x& {5 z f1 x
用我们刚才制作的基础镜像随便起个demo程序验证下
- s$ I# ^( C& f8 K- c) N 4 Z5 g) p& @# V* M) M7 n& O9 s
- 已经包含了tools文件夹了,里面存放了我们的tools工具
5 n% A0 W/ c, W% x9 Z
2 y) {* y' _ p$ U$ g. F* O( \" w- l0 \' @+ y" f: v
1 I" A } u: d) c7 C6 X
- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
' _ }9 g+ O( k; U) p. _& J' B l; @' J5 g+ k( V4 W: A' m
至此包含tools的runtime基础镜像制作完毕。7 o: ~* H( V3 m- U
9 P, t0 p4 M3 y. G/ V' Fdotnet-dump) ?7 s0 V/ k5 w4 \
7 |7 D. ?2 k5 N. _
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
- J, l7 K9 j( v; v2 Y3 J6 O+ ]5 z5 m
0 L8 d# t3 ?% Ucreatedump
+ ^5 Y8 E# ]% Z3 ]0 O+ j* I2 R" e }
; L2 R# G1 F6 D5 ^" @8 s9 _0 |它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
5 W; f5 x' A! F5 {+ R虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误) V6 D# E% a9 r" J
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
% g& x( O9 r [9 q# B/ ]开始使用:7 o4 S4 J, H& R8 K$ X
) ^+ E- ~1 |" y" |6 E! r- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
) N0 ^3 j8 W2 z9 e. O$ i
3 {& N! }3 a" H, Z ( R8 k/ }5 E+ {2 Z( a
- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功 ' d( ]1 S5 e1 ]
- 如果报权限相关错误,可以在你的yaml文件里加上:9 y. p! q V, y4 Z: R
) Z+ I z% v: n- x
4 ^; h! N: q! f2 w" N0 E" Q
分析coredump文件) e2 m* e" u9 X
' T/ w- N$ I" k4 }. O
先将上面生成在tmp下的coredump文件copy到可以调试的地方# o1 @6 C |9 F/ h/ H
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
+ ~+ g% X, c+ \9 V' s9 _# T$ i9 y! e- }5 Q3 }3 y
然后为我们的coredump.1文件下载关联的symbol:
: }- y2 ~. j8 }$ p4 @) w! _9 d# e如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
5 W2 ~& _! [7 m/ ?) A) T4 K6 k8 a0 b8 O( J5 w, f3 Q
, A- c8 {2 h, Z0 t- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
& M+ n1 T% j* T; z, A% @* J9 O - sudo yum install dotnet-sdk-3.1
9 N6 c8 q- I: w9 v9 W& Q 如果dotnet-symbol没有安装的话,安装一个
4 C4 k8 j2 M4 e; |0 M1 G# k
4 t, K$ [. p/ D1 ~4 H) y9 p$ H " \! h n8 n+ A4 Y1 ^7 d
- dotnet tool install --global dotnet-symbol 6 S- \0 e) c" ~
- 然后关闭当前终端,再打开一个新的
# Z6 i" m8 d! } o% V! d5 ~1 q 然后执行dotnet-symbol --host-only --debugging coredump.1
; ~! X7 V! \& R; F' J5 D) A6 Z' S" q( N; `
2 n- ?9 ]2 J/ H2 ~5 ^
# h$ N5 d6 e7 T) O- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
) N# x1 e$ |8 q+ B. Y
& S' r& f. L2 k- p- v! `然后我们使用lldb进行调试
( G0 x6 p' l! w5 O& k7 d9 T
x8 N* s: [9 u A& ]: s" |8 G
% [/ _* C& [3 U% J8 g3 Z: \1 _ w- 如果你机器里没装的话,先装一个吧
, M4 u: L$ [! r5 v9 l$ S - 安装sos插件:* ^ ^/ E9 i& z @# @7 Y, S) r
7 V: j9 X0 ?% H# M' E+ N
- dotnet tool install --global dotnet-sos
( o. X2 _! G' y8 Z5 T! g# c - dotnet-sos install $ E+ n8 {5 z# U* L/ Y
7 m- a: z! N4 _' T+ k
- lldb-8 --core coredump.1
1 f0 k* [7 K: X( z1 l - 然后就可以用lldb来分析dump文件了
0 I0 R) |+ u% k * u: E0 Y+ p! x8 E4 i0 d* }3 {
相关资料:
9 _, p v, {& Z3 A2 F. n" L4 [7 \6 [9 T$ L7 `; l% ^5 X1 e7 _
w. V5 M2 V+ r& D! Q1 o U
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol 1 l8 p8 ^) G0 ~* I8 Q
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md
- }, o3 ^# h$ D' ?8 L. ~: _/ l - https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ , n/ y8 d& \8 L; N+ S
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md
- }7 t6 u" ~+ r7 d5 _ - https://github.com/dotnet/runtime/issues/11012 1 }- f6 F/ ]; O/ F' f! k# L# ^
- 关于大对象使用的注意点以及官方blob gc的实现描述2 H' j. {( ]- _2 P) C, a
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
G7 @/ I- i6 l& d! T% W+ O: p0 i. v A5 U3 B0 t- p
来源:http://www.jb51.net/article/232931.htm7 t5 J' e7 c, n3 e0 E
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|