|
|
目录 _6 E) c# D9 H; l$ ~4 m( |. }
1 y p" f0 G+ ^$ d! M0 m) f8 R9 Q a# W4 f( @5 ^- A7 t, ^
- 安装
2 e# E. _' G% {6 e' O - 验证
4 R# E4 x+ E7 w# Y; t. @6 d - dotnet-dump+ d" J0 }: m0 b+ p- J
- createdump
! G6 T! s5 N, q5 m9 q3 i# G3 B7 { - 分析coredump文件
" A5 k/ m. D2 f3 U5 N: Q6 \& F - 相关资料:5 Z( R2 V" E3 O, A
! d' Q4 e) A) x ^7 W
安装7 ~4 g3 v( k5 w# \% w
6 \; N: T, U& R: i/ _
- W# S. @/ ~$ R# @. c3 u: ]
- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像
" \7 v3 C3 Q" t: W+ m' _# K - 准备Dockerfile; s- `' }, b7 W: ]5 D. g) `
- 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
复制代码 验证
3 Z4 @: }- k' U J# k; i) t O4 F/ k3 G
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多8 e2 [: f' g+ m, w
用我们刚才制作的基础镜像随便起个demo程序验证下- @- d% J) ]3 z
6 W, z7 j( X5 m4 X- M- 已经包含了tools文件夹了,里面存放了我们的tools工具0 o. z* L3 z& \7 u
9 t# J. u1 h! Y$ c
/ d+ C f$ A+ c7 [; g
# f) [( ^+ B, Q# N2 q( d- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)3 z' t% y& _0 p5 _* R. M6 N
9 u6 O' i% k* j" O5 c" b) a& z
至此包含tools的runtime基础镜像制作完毕。
, e6 w: |2 A) Q U! X* I' K6 r7 g) u
dotnet-dump+ J- d" E$ J! r
3 _$ W" W- ?4 e! M j6 Z' N
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
" v( A0 G9 W2 T3 G. }/ g5 y! s3 Z1 g" {
createdump& w8 b/ a( W- U
* v' k! c8 v5 {4 u' s
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法. Y% {, A# p! c
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误/ c5 c9 o, _) F- A
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
: \# Q! @: m6 i: t开始使用:
0 u, ~9 l$ C* P" D; a# }
2 z0 n: G: X& O( J) H- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
1 }& M+ y& D/ p8 `! d: t
) m. T# O) q8 v/ b4 X1 X. I, N
3 l. m* X& d% ]- c+ `' `) `( V5 \- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功 " [4 G/ ^9 q' [% t$ V
- 如果报权限相关错误,可以在你的yaml文件里加上:- b, u0 h& |* s' }: j
8 z6 I1 y4 {2 \: R/ W
9 r0 W( Z6 ^, I* \" R分析coredump文件
# O) X1 t- h% ]# D% o+ `
" h1 [* ^% L0 n1 w, w先将上面生成在tmp下的coredump文件copy到可以调试的地方
+ q# n: M( \& x2 f( E# Hkubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s' r( x+ r6 S6 f2 _- l: w
2 `8 n5 O5 T9 X) J. c5 d然后为我们的coredump.1文件下载关联的symbol:
0 a: g7 g' Q5 o z如果你准备分析dump的机器没有dotnet sdk的话,先装一个把! b$ ]7 `0 m; x+ D
4 B( q6 D0 T# H) A5 l0 L ; W4 w1 H/ p$ Z
- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm 2 q- B- r% [2 U% H* Y/ M8 C2 Z% z3 O
- sudo yum install dotnet-sdk-3.1
L) b' t3 R- x7 W# m 如果dotnet-symbol没有安装的话,安装一个
: t# \. d' Z% N' I W4 l/ E# I( V' C, O& e4 F
' J4 H3 r1 c2 i q6 t6 z
- dotnet tool install --global dotnet-symbol
/ V: k& p2 e3 K$ ?2 [ - 然后关闭当前终端,再打开一个新的
3 E/ r9 J+ ]0 F9 t% ] 然后执行dotnet-symbol --host-only --debugging coredump.1# u4 W ^" f4 ^. Q
, j5 t$ w7 l( D. n/ J& j3 a4 _- r
! f5 A( v$ j8 }) L; q 9 f; x3 O" D: H& V' q
- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
7 Z4 S8 M2 h* [* S$ `& {4 m, I6 |- G
1 h$ \0 v% [ O; `2 y然后我们使用lldb进行调试8 b3 |0 \0 m- P8 Q( t! ^) {
1 ^6 U3 Y" X) K/ u
8 c! @& G# N: c" m5 Q/ p- 如果你机器里没装的话,先装一个吧 + d0 ^2 I; J) l, r p4 }, i
- 安装sos插件:
$ o, M. H) e, L; \! a & [; t: \* U+ j2 R! b
- dotnet tool install --global dotnet-sos # D: T0 N H1 {; A9 Q/ A
- dotnet-sos install
! i0 H5 z5 f; e
" j5 y& }1 f% @2 Y) k3 @& i4 H1 v - lldb-8 --core coredump.1 0 {0 P& _* i* }# L7 M' B4 h# k
- 然后就可以用lldb来分析dump文件了) E8 d; d6 e$ q
5 X/ k, x8 y* x+ o/ g7 S相关资料:
; a6 i+ t# a. ~5 H4 P8 V8 b
C2 _" {0 j% [6 L1 i: D* a4 r. ]' G% k
& J3 G9 h% l5 t: q" C/ C- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol 0 H0 f- \ R1 b& m4 y* @3 b
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md + h O7 a' ]' }- m/ y. M
- https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/
5 r+ B, W d/ _) ~* D5 t0 g/ S. j - https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md ) F0 K9 G2 `) w8 T
- https://github.com/dotnet/runtime/issues/11012
/ [( c6 t; b8 N6 i6 b9 I - 关于大对象使用的注意点以及官方blob gc的实现描述: o& T% e! d( z* {( i r2 Z4 v
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!6 v! q# ~* T+ l1 ^; b i2 {
0 P; E7 m' d E1 Z# _
来源:http://www.jb51.net/article/232931.htm
4 }* d4 [9 A/ {+ O免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|