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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6632|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录& h; e4 M# m( L) `. [8 }

" r: {! v* N/ Q6 z7 `9 O( J

    + w% ~8 K1 I5 j; s; Z8 D
  • 安装
    * \: H$ f$ L" U7 T+ `0 Y  s8 p
  • 验证
    + A8 q9 S, X/ U, B2 u- Y
  • dotnet-dump$ i+ T9 Q+ F& h2 q4 P: Y; z
  • createdump& H/ t# ~; i1 L% Y" \# a
  • 分析coredump文件
    * e% h6 @" I' H3 J
  • 相关资料:
    1 T& \& ]- F2 e

* v, w) n) {) N; y$ W安装& l8 ^, Z. G, d: g7 N, o8 }' x
" r0 g8 G- V$ g  V6 n5 R7 k
       
    . ^/ j  F% V# H
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    7 a" X0 K/ G2 t
  • 准备Dockerfile
    . t6 P0 t0 H6 F. U
  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
复制代码
验证
+ D/ N7 |/ ]& U4 F; k; ^  o+ G; D, L( [. G! F; L, Z( C; \
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
3 @6 w. {9 h- Y1 a9 L. r+ d用我们刚才制作的基础镜像随便起个demo程序验证下5 |, G3 N4 A6 f* b
       
    , h2 |7 B( P( O. w1 y9 c
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    , [0 }7 d4 ~8 r' R8 s  r: ~
. t. ~8 j. g( o+ s- G" k

& m& ]5 U  Y; C& E. J8 g# M
       
    $ U" a1 @/ P1 H- O
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)2 F& u0 n) B; ]

2 L/ V- J( V* c: @& P, Y至此包含tools的runtime基础镜像制作完毕。3 F* K0 C7 J( h/ i
3 D" H2 y0 o' q) w
dotnet-dump3 o8 D  v) Q6 u$ m4 }( X

, Y' ?% n9 y6 d3 {1 }它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
" h8 n' G2 p6 v9 D& E! ?' E
  O. D8 t% \" F7 Z% acreatedump
0 H; f! K* K9 o! L; W- ~
/ v4 p5 `) R1 \6 D2 P" b4 i6 s它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法% P  S. H$ O$ }
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
2 A8 Q* x6 d$ I* U这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
; U6 k3 x5 O% ^* X1 ^开始使用:
" H+ l4 n' {9 U8 H* V2 k2 L
       
    . l6 f) n% x, O3 [
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)9 W* t- \; a6 W/ W. F' N

; [. r6 ^  ~  `& P8 U+ l1 V- }) D
       
    : S2 y7 e. K; J+ k
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    % M6 B9 o+ p, q
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    ( }( @+ x6 l8 ?1 d3 \  e
9 u* |' F* G7 p( m4 V1 n

; k9 v" ]; V, o) X) W分析coredump文件* ~) \6 Z5 P/ G. `$ m1 Y3 K3 N- Z

4 I! s3 p5 k0 y先将上面生成在tmp下的coredump文件copy到可以调试的地方1 h+ W1 N$ L. d7 t6 g- g3 T
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
, m1 u- x, D4 v0 b
5 U8 e6 }/ y6 ^/ t. U% Y- d
然后为我们的coredump.1文件下载关联的symbol:
; M) t# e( E" I" ^. @% F如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
& H" r1 I, {8 A6 q* M3 z- K
  m- u8 k7 E. E; D6 W
       
    3 l$ n3 Z5 E- |* I! B- Q
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm   
    $ b5 v4 A' r% M
  • sudo yum install dotnet-sdk-3.1( c. O# g9 n4 y! D+ z& [0 D- Y$ I
如果dotnet-symbol没有安装的话,安装一个- A* a* @! ~4 n* [3 ?3 O' k1 K9 o+ }$ Y

9 q/ A8 m; r, I6 m, O4 X1 ^$ }
        : Q8 b( D; ^0 F/ A
  • dotnet tool install --global dotnet-symbol    6 S6 A6 }7 S; X! N/ T
  • 然后关闭当前终端,再打开一个新的  Z& e3 q6 |7 v4 N7 [* U- g
然后执行dotnet-symbol --host-only --debugging coredump.1% X; E) n; ~# U  K1 l& b  D* a5 _! N
; M0 ]6 j* ]- ~0 D" T

; a: B7 }7 n* t' V& x
        & F7 T. C, T) A1 ?2 L! D1 w
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
    , ?. F) w: c9 {5 r$ U
0 S" X+ f. v* z" C
然后我们使用lldb进行调试5 p6 [1 W( }- n' o+ M5 F( d

- @3 I( F: _1 J" x6 L9 v
        " ^6 h! e: v( t8 @: R  o
  • 如果你机器里没装的话,先装一个吧    : n2 `' I' E. t( i* |* q/ n
  • 安装sos插件:
    0 N7 [+ Q; F# Y7 {4 W% H2 g
              
      1 T4 ^' t1 `; {) n# b" B8 l4 m& H
    • dotnet tool install --global dotnet-sos        8 s$ C1 \/ y# L) A
    • dotnet-sos install   
        \/ I* m8 C% [* \6 w
            
    3 E! `8 ~/ }& q; I7 _
  • lldb-8 --core coredump.1    ; D7 P" J, B4 q9 M8 i
  • 然后就可以用lldb来分析dump文件了
    ! Y0 p, w/ E. P- ~) |, t) |
. @' ?' W# r' ~! x" k! v$ A# D
相关资料:0 Y1 N8 e* D7 x* n. p  k& {

- Y! }7 ]8 x0 {- Q* N
        - V  i- y0 B- D6 _2 D9 K. [
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
    5 e/ C6 }6 A5 q6 N$ f" x: i
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    ) c/ m: k7 D2 Y7 X8 M. S- ?- @2 ~
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    # [  ?+ b" m% [: s
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    , A9 l$ d9 L( L5 n
  • https://github.com/dotnet/runtime/issues/11012   
    * y. I! Y1 d# l' W: l
  • 关于大对象使用的注意点以及官方blob gc的实现描述
    " q6 m2 s1 W+ @% t5 ^
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
6 O/ M7 ^3 J* F, ]$ y: Q  m" h! g
4 z9 `5 {# h* H- _来源:http://www.jb51.net/article/232931.htm
( A8 v' T) V% c8 W  V0 C. h! J免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-23 21:01 , Processed in 0.040057 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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