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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6636|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录1 V; W9 ~0 ]& w' e1 n
9 v5 x* }* {) d7 D
    & k/ \4 S+ @. N! Q4 F9 e
  • 安装
    $ R& m6 d" G6 s# A2 Q
  • 验证& {1 C4 }7 k3 F- ]4 ]. Z3 j1 H0 K
  • dotnet-dump
    ! L( e# g7 t6 B6 b) V
  • createdump* \. f9 E. N. ]* l6 J& z
  • 分析coredump文件
    * k' q( G  n4 t; _2 @9 o
  • 相关资料:
    ! z8 ?/ [: }6 e+ {/ b0 f

% F* O) C) g( e8 R安装& p& d4 p5 h9 N' E3 f5 _

1 S2 p# D  e9 O* a( o& G* U
       
    " ?" {. L/ {. A2 l6 K
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像    * n. `5 |- j; V0 `4 j( [' i9 m6 m
  • 准备Dockerfile
    6 {5 C4 E# i. x
  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
复制代码
验证
) {5 G  z6 z0 V+ h  E4 ?4 _8 P& Y% w4 [
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多( l2 B9 W2 I* F
用我们刚才制作的基础镜像随便起个demo程序验证下
# T. W5 E7 a" }7 }  D* ]' K& }
        ! {5 _. U2 X* x  A2 A& l
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    ; ^9 [1 g- w: b( u: N

8 y. d6 P  O8 [9 I

( V& i- e# `) D7 v/ M( v" O
        - S" M% A# g, O: P8 J5 e; g/ O
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)" R, w5 z: u) O8 |, j/ c
9 E2 r  ]& [: i
至此包含tools的runtime基础镜像制作完毕。& o& h* D% n9 m1 ?1 M. C$ s" b

4 B$ y2 A3 ~0 K, p; R8 Odotnet-dump
, M, i& j* ?/ d  J0 R2 R
* P1 i( O9 G& q它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致7 o* C/ ?' I7 n' H9 f
/ Q, t" z  v, b1 e7 `# |
createdump
1 z9 ?$ t) T7 p9 b) A8 G& K/ Q" I- r% w( f& g' ]# S
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法6 k2 {3 @1 Z/ D" n9 N
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
5 P+ S" z/ x. y: l  s9 U4 E这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
. c/ e( f* z+ v7 v8 r" G7 G% C) o* j% z# Z开始使用:, f% L# p: z$ J4 T' @
        / p' \+ R: V1 Q- [3 M" T! {% L4 F2 l
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    & F; z! }' k3 R/ I5 ]

0 q8 r8 \0 f' r
        : d1 E% H9 f+ C5 }7 b2 v
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    ( d7 K+ i3 @  b( c
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    9 [8 H. y. g5 l( L: o" n

3 `8 s* ?6 W/ n! v& j& W
" B. F5 G/ m4 j: O分析coredump文件
  W6 }' U0 t- ?, A, M* @! d% w; N9 T
先将上面生成在tmp下的coredump文件copy到可以调试的地方; `' X9 [/ l4 Z0 K
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s% H4 e- k6 A$ @$ R8 m4 T
5 Z( ^3 d2 J; f" N, R
然后为我们的coredump.1文件下载关联的symbol:
: u! s4 k& [9 o  x' P* ~  I* e/ ?如果你准备分析dump的机器没有dotnet sdk的话,先装一个把& e1 f* {7 C8 C
8 ~2 O8 _) L5 P* R
       
    : ?& A# b, D& Z: a1 N
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    3 ^" W+ p: w4 t, y1 {( {1 G
  • sudo yum install dotnet-sdk-3.1: _. P- F: R" [9 R* b3 d# _/ a
如果dotnet-symbol没有安装的话,安装一个9 }: _9 A9 y2 b
2 d" w4 G% _$ R, |
       
      A. {0 ^" Y6 N" w
  • dotnet tool install --global dotnet-symbol   
    2 G: h# R% {) m! `
  • 然后关闭当前终端,再打开一个新的( `' o% ^7 @' Q8 z
然后执行dotnet-symbol --host-only --debugging coredump.1
+ V% a, n$ k6 R8 S0 [8 ^: S3 X" Y7 O; o

3 V9 k  S) y: \' p1 a
       
    : p, p( h9 }( @6 K$ a
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样, r7 C( K! z, U" m, h% D4 w& h" O
: a) t7 D5 B+ v5 ]8 W  L+ C
然后我们使用lldb进行调试: _2 n) s2 h& e

: e" ]* Z3 c: D( }* o: ~8 v8 B
        * }3 k7 @+ y. b; d! @1 T1 U/ C
  • 如果你机器里没装的话,先装一个吧    7 X3 c$ _8 E8 A: m8 H  z$ M
  • 安装sos插件:
    . s7 [1 ]& W7 G  A+ ^" u: N
              ! j: x  u4 A! o3 q* O$ s
    • dotnet tool install --global dotnet-sos        ) l7 Q  t! |# _; {
    • dotnet-sos install   
      2 `  [( d2 }5 A7 Q8 w1 `0 k/ E2 K4 d8 ?
            
    0 D# q: \& x. Z
  • lldb-8 --core coredump.1   
    9 T. B$ U+ w) C8 k
  • 然后就可以用lldb来分析dump文件了$ L( L6 F* k4 `' ^' R
# T  z6 G( w% K& D7 H& N& @
相关资料:1 H4 [! j9 L. N  M5 R# U, r0 E
# n* [0 r# D  k9 @" K
       
    : A: S  X1 E. H3 Y. }: A$ [6 k
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    4 @1 v6 b2 d  Q; y+ ~& Q1 T
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    5 u7 w+ r- M: c" b$ v
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    . h% v% s" e. V/ C7 ]
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md    1 i% d7 K$ c/ x5 k
  • https://github.com/dotnet/runtime/issues/11012    , Y/ E3 }' Q% A, F5 z/ a
  • 关于大对象使用的注意点以及官方blob gc的实现描述
    1 S4 A! C/ @! _: v0 m. |* ^$ t9 i; j
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!! |! h( u$ P5 o2 L5 ]3 ?
1 ~3 }7 h# Y8 U
来源:http://www.jb51.net/article/232931.htm7 @0 S+ N# K4 K) P; n0 k7 e
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-23 23:43 , Processed in 0.038426 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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