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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6604|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录: T/ a) B& C" B) G( }# I9 A/ j

3 J2 b& ?: |' N' Z

    0 O) V) J% e) I. m; v- n6 T7 Y6 R
  • 安装& w5 C9 [" T& T) u' ~
  • 验证1 Y9 n& ~' ?. T- \5 u6 n
  • dotnet-dump
    % ]* v8 u6 K2 a& J% E* G
  • createdump
    * x; _9 V- x) j& X
  • 分析coredump文件
    , E; t& p* a9 k: B* @# j5 J
  • 相关资料:& p( T* P+ `6 }7 o
4 o1 s) [8 w, n6 ~  K: d
安装
3 X; ]3 v5 h2 |3 u1 |& ^% `7 r% m3 C6 v4 Y8 K# V* O
        7 H9 h) K% I# g- c
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    " x# k  T  S9 j) W8 f
  • 准备Dockerfile# }" I' O# m& \" m
  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 b/ \% \$ v5 i$ Z

" q3 A; p% Y, Y; O! v" i, l7 A  w基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多3 k, @/ y4 `2 n3 X9 R- B) }
用我们刚才制作的基础镜像随便起个demo程序验证下
& ?( v7 W# m' F- o
        . B, l  C2 d% g2 @& j: M( r. Y
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    7 t3 |3 p1 X% d9 o. v
+ v* v0 G/ @. H3 W6 ], S

% ]2 {& q1 n7 C# u* M) i
       
    & b4 k* c: x% J% B
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)2 u, |5 h3 J; I" l, A  j4 J
1 t( ^, L4 u3 v6 e; y
至此包含tools的runtime基础镜像制作完毕。
; n+ b  B& X5 V$ J- G8 O
4 R5 \- m8 Y2 H7 {5 ndotnet-dump
0 S/ q" ]2 W4 z2 {. J! v
! f3 Q9 h- M% A2 M它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致8 w( C" O) n1 |) ~' _
8 z" |0 g2 D# o, m
createdump/ r# l9 {. N0 \
, N6 s* ^% e1 L4 Y+ R8 z0 z
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
4 P9 {7 m9 C2 q* J$ u1 z4 V) [" A! v虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
% @/ k. q( U& X7 ?这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下+ l/ x3 Y9 y0 H1 X: T
开始使用:
: c( A+ q. a" [. d
       
    - v: D! O, L: [' r8 y  K
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    ; y1 {' l$ p% z. y
6 [& z6 I: C3 j, `) Q- S
       
    % |* l) T# S, G4 e5 C, A1 D
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    , ^9 T: a. z& ?+ L8 f
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    - Q9 ]) r- n! v' Y2 A7 Z

$ S: J" e0 ~- j3 S7 H8 i4 C
8 @+ S* q, U2 N0 n0 {分析coredump文件' [7 Q- W8 t* x$ {3 X

8 B+ w9 c+ W4 d* |& J/ [先将上面生成在tmp下的coredump文件copy到可以调试的地方
+ A. v& x3 q  f% f% b6 F% Rkubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s! l% n$ j5 _& ~$ x  I; i
8 @7 K* S1 D) L5 n8 a; w4 v, ^
然后为我们的coredump.1文件下载关联的symbol:
7 W$ _% v" O. \2 }如果你准备分析dump的机器没有dotnet sdk的话,先装一个把" J' Q" u9 k0 T; ?
! _+ @( A! n  H' e2 W4 k* X. O5 Z* W
       
    9 t0 O5 }) K+ U* `# A; e' Y
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    : y- M# r6 u. C; b% ?9 f6 h
  • sudo yum install dotnet-sdk-3.1
    $ J# z3 h0 K6 \+ l  L# r
如果dotnet-symbol没有安装的话,安装一个
7 |% ?/ d1 y1 M2 L( r! P) y0 ]8 Y; v; l/ O- K3 L. F
        ; ~& \6 }* H& j0 V$ V8 N3 S, ~
  • dotnet tool install --global dotnet-symbol    ( r3 z4 @3 T8 n' @- v& o
  • 然后关闭当前终端,再打开一个新的& \1 A9 W$ T+ d
然后执行dotnet-symbol --host-only --debugging coredump.1
4 G5 f/ q- q  g7 N% |: }( Q2 {! p7 W' I9 `8 e

1 ^- ^" j( I0 i/ k# f- C
       
    1 G7 X- n8 t: A* c
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样) R7 r  _4 n' h! p$ }7 k
# l4 Y9 P( p; U8 y( v3 p
然后我们使用lldb进行调试- `7 g4 ]! p" Q6 ]- ?- ^1 b' }

- y$ g( n3 U9 p1 R: ?5 _
        . s+ u# \, A8 D
  • 如果你机器里没装的话,先装一个吧    ' ?$ s+ h7 t. {3 Z
  • 安装sos插件:
    9 C9 z- N# O  _: }8 q
                h3 D, L5 i  i1 J: n, A
    • dotnet tool install --global dotnet-sos        
      8 j9 a: f9 T/ e1 }3 j% g8 l3 s
    • dotnet-sos install    & s+ X2 W, V# F1 W) k
            ; d9 t7 P5 S; x
  • lldb-8 --core coredump.1   
    1 h- r9 ?- U* d8 B
  • 然后就可以用lldb来分析dump文件了
    1 s$ {& Y2 j" s3 g# U

! }" J, _9 ~+ L) {' a相关资料:
: D" U- Z; @' h3 d* I2 ]( S! Y/ F2 |& G' b' F
        $ @! Z* p- c5 y, a; h9 ]
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    5 H' v0 t; L/ X0 F8 K! P7 ~
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    1 ~+ W- O' O# a9 w) @
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    & a- F- q" ?! G  {9 `$ K9 s2 r" f7 v4 `
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    & T* s& R& l4 B9 J7 |$ k  o
  • https://github.com/dotnet/runtime/issues/11012    ) u% t. G3 S4 d7 v
  • 关于大对象使用的注意点以及官方blob gc的实现描述9 N: u( F+ q- {3 W9 [% j
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!6 Z8 a2 t4 d; m: M, x- V6 R
  l! ]4 F3 }! K6 `1 }# S4 E
来源:http://www.jb51.net/article/232931.htm
# ]' ^2 P; Y0 g' ~- P免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-28 04:47 , Processed in 0.040516 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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