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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6625|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录
  c& E1 k4 ?( w( G# n3 ~) a' m9 U4 ^, m8 P$ {9 w( L

    ) e0 w! Z) l- F# ~: P/ Z  `
  • 安装
    & p/ q$ i9 r4 B0 y/ d
  • 验证, }5 ]3 V+ H1 ?$ Z8 \. N8 _
  • dotnet-dump7 b' z1 X8 L6 V% {2 w
  • createdump" g  f- i1 k* R! l
  • 分析coredump文件% f( o* @, @. v
  • 相关资料:
    " K7 H- h2 P, N7 W

& V/ p) U# R- h' y% ]. s2 }安装
( N. N( c8 a6 K1 y
) V5 }; V. P3 ?: u4 ]! |! L
        ) H' J  K% m; E3 n) c5 }
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像    ' \& V9 c1 _7 t# }7 k
  • 准备Dockerfile
    % i. e4 x* ?) H$ l4 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
复制代码
验证7 B" `$ V; \) R$ y+ v* c! ], j4 Y* Z0 s
6 }  x1 {# r; E! g3 X- i( z; G
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
9 ~+ y5 `7 q  Z1 c* O! z用我们刚才制作的基础镜像随便起个demo程序验证下
6 z% a* g$ v) B- j4 T
       
    5 w' E# F) r1 F/ k; u# l6 W
  • 已经包含了tools文件夹了,里面存放了我们的tools工具# g: k. V$ A1 m+ y: j; l5 f9 Y% [
2 b4 X9 S# f( @" i
3 k$ t. a- y$ x, s, h: u- \$ H$ m
        0 @- K) _5 ~7 z& M9 z/ g
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    # Y7 n* j% F" g  _
$ K0 a! v3 B8 L7 }9 j
至此包含tools的runtime基础镜像制作完毕。
1 R3 I* V6 n3 ?& M! T# w. r$ l. h/ Z, A$ X, s  s* j. i
dotnet-dump7 G1 F0 v0 g& x! U% ]9 m- H
; F& U. c% o& x
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致8 d4 c0 u3 {! V3 G, a0 @6 j1 l

5 V/ W+ }" B) L" vcreatedump2 y3 Y& @, p& a* B# |7 _( k" ?. U
6 Z9 v: f4 e5 @# {+ ]
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
2 Y! ~( c" \* U3 t( I2 m/ x虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误: y+ ?1 m' d# b8 b" q, B- H
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
9 b( d$ k) T: \! s8 o0 d7 A开始使用:+ n4 w' q7 B! X8 w
       
    + M8 M; @" f; @; A: _
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)6 F# O. s3 m+ P2 W- G" @+ P! h

2 X2 \6 y9 r2 l8 G8 C  ]
       
    1 z$ }$ e! T0 u& L' j* C* T8 e# {
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    8 O% K& x- c" t- E
  • 如果报权限相关错误,可以在你的yaml文件里加上:3 a* y5 K' c' X* s4 ]8 g" ^3 q+ O! E
: q7 ^8 d! e! M, Q
3 w2 b5 L/ M$ B4 K3 T5 v6 [
分析coredump文件
5 q/ w7 d. D  Z9 |5 Z5 O* t: }( b; I8 k* i
先将上面生成在tmp下的coredump文件copy到可以调试的地方- ^: u2 Y. \( U: D6 I; X0 z8 X
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
+ p4 B1 E+ R. g$ q  m* Q  W4 W1 D/ D

, a" x7 U9 W+ t. C% B然后为我们的coredump.1文件下载关联的symbol:
, ~. r" G/ R" P& `$ M; m如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
3 @5 w! G& \. p3 C/ n' p# r+ z
' s4 K, n4 G! D: j1 K: h# s  x
       
    # D6 x3 F' L; v+ y! ]
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm   
    * X/ O8 g# ?! Z  b( r
  • sudo yum install dotnet-sdk-3.1
    , t5 r! ^# j. h1 T- f' E+ d# y
如果dotnet-symbol没有安装的话,安装一个! @7 z5 S6 q( b& t

# u" r, K" {! ~8 w, N- k5 `4 w
        ! |9 L7 h- ~  k/ E, f: L
  • dotnet tool install --global dotnet-symbol    * c9 U3 g. v% Z# j
  • 然后关闭当前终端,再打开一个新的
    / `1 a8 r# D8 G3 @
然后执行dotnet-symbol --host-only --debugging coredump.19 e& i5 p* z) k

* f- j# f5 n% D! R+ _+ K
& B! ^8 \# y( \% w
        + o! y# ~! l# N8 Q
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样3 V+ G% @5 w; O# h3 q( R

( c( o; ~* N1 e6 G: Q8 o0 j然后我们使用lldb进行调试/ U6 q: `1 H" q8 O
% \8 L4 y$ l# d8 Q# p
        : o* _- @* t2 l, s0 y+ j2 u; B
  • 如果你机器里没装的话,先装一个吧    + ^# B( P" \1 s$ W4 m- Q
  • 安装sos插件:
    3 [' G. p( j! Z/ \. t7 s! I
              . s: C/ M2 j# o% M
    • dotnet tool install --global dotnet-sos        
      ' Y2 P! P0 ^. i) H( w' c
    • dotnet-sos install    2 C! P4 q* I8 {9 Z
            
    ) A# o. K- a. P  d; D5 |
  • lldb-8 --core coredump.1    ! R0 Q0 k6 h0 A" |6 X6 ?* c. Z- n
  • 然后就可以用lldb来分析dump文件了
    6 o3 Z4 C( s5 U& k; t% M2 K
) z2 a/ D6 D/ n) r
相关资料:% D# M5 ~3 T0 ^: |9 C8 _
* l6 V5 n& F0 A6 |
        : P" c. i4 [: d8 E) x* w
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
    5 Z  p) U- q6 a: B& q* P+ Z
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    3 m+ ?% K7 A4 a% y$ y9 h
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    7 |0 V7 g9 I* P, f$ o7 m' g
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    7 w$ t, r! ^: e! X
  • https://github.com/dotnet/runtime/issues/11012    ' E. P4 N( B* S
  • 关于大对象使用的注意点以及官方blob gc的实现描述
    6 Z3 A0 U2 I; i# G5 u) h. q
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!' R- ?1 `' ^3 F  e/ f/ n

: w  J) B' p% D来源:http://www.jb51.net/article/232931.htm5 r7 i0 d+ c, G0 v3 J
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-25 20:37 , Processed in 0.095854 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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