京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6657|回复: 0

正确使用dotnet-*工具的方法

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录/ C' j8 R9 c) p- y! ~8 b
/ N% }4 F% ?6 b: N0 h. z

    4 C- Y) U: `% e. u5 j+ D
  • 安装
    + S+ I7 l9 j. d1 Y" x  v4 j" o
  • 验证
    6 U5 q$ z4 h! S5 k* B* K
  • dotnet-dump
    8 C0 \+ }: l) ?- t( z! R
  • createdump
    $ G# R- O1 I1 v( g0 u
  • 分析coredump文件
      Z& u6 k8 n( j
  • 相关资料:2 O( Z. V1 U7 `4 ~
6 \+ {; G: M9 w6 U
安装- W  h7 k& [+ r3 N* @1 \
! n9 L2 @$ X" v+ G
        % i4 q5 Q9 \' [/ O
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    & f5 R' B) Z) I& [3 v8 j
  • 准备Dockerfile7 o$ I0 |: ?1 e$ ?: R& a& Y% g
  1. 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 F; m% J; P7 |+ n7 a

8 U! n# A7 w& k+ c2 J% T% _基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
) J: A8 c8 t/ O5 |; z3 _' _用我们刚才制作的基础镜像随便起个demo程序验证下2 w: B% b* k! ]3 n# K5 S
       
    6 `" b. h3 m# R0 D5 O; ]3 c. P
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    ( V9 q5 m, P. k" f; @

2 r4 J5 W8 _6 ]

4 ~% l+ f) D7 q9 L2 n& F
        ' T# M: I% h3 \5 }! p& j
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)2 `  g1 r( l0 m. l
5 T2 ~( z" Y5 ?) R3 \  d
至此包含tools的runtime基础镜像制作完毕。9 E; Y0 E/ f9 \7 a

9 L( o7 X/ x( V8 X4 Y( {dotnet-dump+ w8 }# h: E* F. {

4 @: _8 v; B/ Z3 w. g# n它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致& U  p1 d, M  b7 G5 i1 B9 X/ H) p) _

% l2 e( @1 Y5 Xcreatedump
+ C7 \( V( `8 `) n; U* _6 I
# H% U" p8 G/ s& p8 t它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
# R1 z' V3 h1 E9 @! T& G虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
4 w1 t0 t7 C- L" b4 f& W' {" K这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
1 {  |& ]% r* I3 t, _) j开始使用:
$ a% s" j5 B8 T
        3 W& D/ c" u( ?. `6 }% ~
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)3 S- C# q) Q5 o3 h7 ?1 ^  P6 S, l9 D
2 c& X) {% U( h0 D7 @% p0 O
       
    - N6 ~  @& T5 x- f" u3 j
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    ) I" \5 p, D  W+ r
  • 如果报权限相关错误,可以在你的yaml文件里加上:# p0 A, p$ ]$ n' K1 ^; k

! v( A3 h4 E! H4 Z/ L
: c) f( \' k) n- L" j7 w- k7 u1 N分析coredump文件
" {! s# g- w$ e( }* n7 U+ q' Z6 N) W+ [; c' K# m
先将上面生成在tmp下的coredump文件copy到可以调试的地方7 h& m, Q) X/ ?( u, w* R6 _
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s" z4 @$ t- t7 ~/ j( H" c& R

- W# M: v6 }' z+ [& r% x. ]. B然后为我们的coredump.1文件下载关联的symbol:+ o% D4 l; i% a9 l+ `, ]! n6 N( z
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把' j$ M9 t% J) h( K
5 ~& G+ q$ g# \* |+ T" Y4 g
        4 }( S* ^% [: K# h8 o
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm   
    * E1 g9 G( z; n0 K6 e
  • sudo yum install dotnet-sdk-3.1, ]% u5 y9 n  l1 M
如果dotnet-symbol没有安装的话,安装一个( L; Z) w2 f# H4 }1 W4 v# K  |: ^

6 s/ t6 W$ ?4 V$ p- }6 H
        2 r1 n* h/ _" c% j9 O/ _
  • dotnet tool install --global dotnet-symbol   
    8 X3 K% h# O' D6 \0 u+ v
  • 然后关闭当前终端,再打开一个新的- f8 x; `7 ?0 ^* v# Q. d8 a
然后执行dotnet-symbol --host-only --debugging coredump.1+ ]! C. \0 n7 B" \' ]. j

/ V4 k4 o4 N+ A0 P8 u# i! j" ?5 G
3 W6 T6 k+ S1 k2 I1 C+ c
       
    % d' O' K$ @6 J/ P3 h
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
    % W! z" H" m+ p. m% _

: c$ H+ z5 J7 G& _0 _2 }* h然后我们使用lldb进行调试
  ?1 Y: `  v, }. n  R
$ I, A& J: A- G; m
        + b  D$ [6 S0 M+ L9 Z# a5 v. [, q: @
  • 如果你机器里没装的话,先装一个吧   
    . z$ ^+ u3 X8 R6 D" i) _9 B
  • 安装sos插件:
    , H! c. U, m8 [+ g3 I* p
              : C+ I' j: `9 I1 U) @# A' p' H* Q
    • dotnet tool install --global dotnet-sos        / D  k' b7 `9 f
    • dotnet-sos install    8 o2 |, t7 Q5 d( H/ A+ s
            . s1 h% w" x" T2 r
  • lldb-8 --core coredump.1    ' Z6 m( g) n0 D( F
  • 然后就可以用lldb来分析dump文件了
    $ I& v: N4 v. V. J: C
7 R% p8 G+ Q- x5 v) f, G
相关资料:
8 ^  g0 ]& X* f( m- A6 }( w2 [- J
        6 Y/ ?! `* [' ~( J9 k
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
      M( o. Y/ ^5 \0 ?  b+ P
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    8 o5 V. g9 e4 ^& D5 X1 F& u! \
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    9 u- E8 ~0 m8 R+ k5 M
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    # _, y7 J. y4 k9 _
  • https://github.com/dotnet/runtime/issues/11012    0 h* \2 b& S- j; d& |. L0 n( G' V- E
  • 关于大对象使用的注意点以及官方blob gc的实现描述
      v8 E  K; s# e- q$ U, \+ s
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!' ^# h. x7 |" L; M4 j

; K* h. }2 g4 P9 R3 E/ {" B来源:http://www.jb51.net/article/232931.htm
' ^1 t9 w* O5 S+ v8 }  O免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

帖子地址: 

梦想之都-俊月星空 优酷自频道欢迎您 http://i.youku.com/zhaojun917
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2026-9-19 21:08 , Processed in 0.046094 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表