|
|
目录
6 ?5 W9 M+ s: K4 k' K
/ n; _/ h9 G" O( `
8 e8 u) j* Z$ D2 f2 S- l- W- 安装- }0 t& D0 M& @( \1 }9 G4 \
- 验证
' s. T" v$ F4 T" I! N# C. ^1 E9 Z - dotnet-dump8 r9 V: i* H4 e" P" E
- createdump7 u0 ~% l* |% r, y3 Z8 R
- 分析coredump文件3 O7 G D; O q+ |
- 相关资料:
8 K$ u4 ` N: C
8 u( k1 \0 t9 F( @安装
; U; \6 O; L! }( `6 i
( _/ Q0 l; N# K/ p' n
8 S' u, C Y) r, Z" J5 b8 T- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像 6 B. H6 d. f4 G
- 准备Dockerfile
* S+ E: _# ^1 B4 Y8 c% ^& 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
复制代码 验证8 ]( C: ?$ R, F! o& v( ]+ u
5 K- v# r) w1 g) O基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
p- \9 c9 `8 t, y用我们刚才制作的基础镜像随便起个demo程序验证下+ r0 n! [; R% O0 B6 [3 F
5 T }( p" [) e2 L% I6 ~* O8 V
- 已经包含了tools文件夹了,里面存放了我们的tools工具
Q0 Z u3 E: f& _, C ) l& R8 l8 g! G
5 E* J' {( l3 S& m: C7 k0 z
7 @( }9 U9 ~- k; `1 Z8 j% {- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
2 R5 @* d1 [& T5 V0 D& W
7 ]5 v' w* x+ {至此包含tools的runtime基础镜像制作完毕。4 q: Z. D- Z: H$ ^
; Q4 A6 [9 V0 F2 q" ^4 F$ Hdotnet-dump+ R% V: y. i; b' V: s3 f
9 p, V* j, `# a) K! f: Y
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
" }/ w* W$ F6 y1 V9 H; ` y
& A5 N" C! @8 }" {+ b# ] {" I$ `% _createdump, i7 K, ]( e' m+ N% N A
& N% Y* J4 J& Q2 m, H
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
: N+ N7 U8 X2 ^虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
! j* O ^/ }2 v3 k0 A* ?这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下6 d* h1 t* V: p# R# l
开始使用:, A* _+ x8 ^% h J Z
* m, V0 r" J7 _" N- a! F- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
" O* J) ?7 f# b9 F# O8 D4 R, } ! ?# Z4 ]/ g/ g) z2 s
9 B" I) n% n! a- W* I2 l! }) {- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功 * m. D8 K! g1 Q6 g; p% X
- 如果报权限相关错误,可以在你的yaml文件里加上:- n3 [* @) S; `6 K6 b
+ ~$ S( Y9 Q% g ?
% F; q% y/ X9 O) I% |分析coredump文件* `6 q& _2 }- o& F% ~
' f8 ~4 u6 h+ B( y% }/ j6 s- Q
先将上面生成在tmp下的coredump文件copy到可以调试的地方- v* C( S s ` [6 t* C
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
+ t% ?2 F; ^3 F# [! e! T/ L, F, L) W' k4 `
然后为我们的coredump.1文件下载关联的symbol:; `8 b0 X/ b/ m& a# n
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
9 m+ g5 {, y' c$ B5 M# J) ?- ?8 g8 y3 K+ [
5 @, p4 y6 ]1 n- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm # p2 u& Q5 x. N* Q* e( q- _7 \
- sudo yum install dotnet-sdk-3.10 J( s% a$ c4 R0 W# n- v- e# w! E5 e
如果dotnet-symbol没有安装的话,安装一个
) S6 f0 s1 U( m8 P+ t; S1 B3 R
( [8 o9 u: {) i! d3 k1 r
, c# ~' Q/ W- B. {- dotnet tool install --global dotnet-symbol 3 W' D, M0 @8 J) f0 ~
- 然后关闭当前终端,再打开一个新的) r# s, ^% V+ G* M7 l! @/ Q$ Z
然后执行dotnet-symbol --host-only --debugging coredump.1 W# q, Z% S7 A! y, T$ S$ n7 @% U
' g# z n3 f( Q; c
; r/ r6 @2 T6 d # K4 T+ k4 T2 S6 E& ] z0 T
- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样! r/ q/ { u5 P4 e* [1 D3 U
- K; I4 b2 u% J4 W0 m! ^* I然后我们使用lldb进行调试2 Q8 I5 X6 [8 ?5 |7 }% z0 u; b' o) ~
# @4 f8 A* i4 H
: s' t. s" b# i5 y2 |& f) A
- 如果你机器里没装的话,先装一个吧
) G5 f* e _# m - 安装sos插件:5 M; R5 t' \) [3 X4 f. I% \
" n! h6 T4 i' U) R2 B- dotnet tool install --global dotnet-sos
8 H* X \" T% |% e2 @" [) s - dotnet-sos install / e0 H% Q1 ?4 a7 ~' j
+ Z) e+ \1 m5 q0 Z4 \; e9 h - lldb-8 --core coredump.1 ; Y, z/ v {( Z- b
- 然后就可以用lldb来分析dump文件了
5 f9 d z8 o0 ] j 7 C i- C" g5 G! p# ]7 N# S
相关资料:& d( H/ U* E% y. E# Y6 j
8 ]. ~% L0 Y$ Q
# P$ o- o- y& d6 Y" @, m, s; \- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol . }& z+ ~: V# X2 U
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md + `$ W" u" U$ g5 M ?: L" ^/ I! f
- https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ ) c5 a5 v# }: O
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md 4 t% |3 H+ @5 d/ i' f4 [9 `; h
- https://github.com/dotnet/runtime/issues/11012
; E+ b8 g9 t+ E( x2 x' M8 [ - 关于大对象使用的注意点以及官方blob gc的实现描述+ L ^' ~8 S% U) p% T% d
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!" s" p! {$ C1 W/ C/ L, q) [
( V2 y1 u* o% t( W9 ?8 W; m
来源:http://www.jb51.net/article/232931.htm
$ ^# U& [7 d; {% e# g2 f免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|