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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6667|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录
) K, j" @* [+ f5 g2 ]
' h, l+ ?% R5 e) a
    8 F2 U8 _( U% N8 q' L
  • 安装" |6 S/ \. g5 e4 T# ^' P; U
  • 验证8 {8 d0 W: e) d! [; [$ [( C
  • dotnet-dump
    ) C& ~+ M% p8 D8 q
  • createdump
    / M& s  d% \: V: g+ a
  • 分析coredump文件; @, {# Z2 A7 D* E: x$ {$ Y# p) q
  • 相关资料:
    6 ~  m; {, N# R" }5 k+ s

! ]8 u4 l" r8 |1 w安装
7 ]! T7 x5 m  s0 Y
# {) C6 Y# ~5 [* x* @6 {, T
        : M) R* N: ]& S0 Y( ^/ j
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像    # v% S3 u7 |; h" o
  • 准备Dockerfile
    , t' `9 b! X4 U+ }, {4 f. S
  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
复制代码
验证. B2 W1 G" J; I: I. A7 B
1 G9 m1 c; ~' K. a& C% A
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多2 _" X1 `) w1 C2 Q) [
用我们刚才制作的基础镜像随便起个demo程序验证下
. @1 V5 h% z# ]
        ( w0 l( i& B9 B8 q0 m! Q' Z6 b
  • 已经包含了tools文件夹了,里面存放了我们的tools工具( |0 u2 ^! L8 e

: ~7 z- W0 _+ ?
% B0 S4 z6 f; Y. f3 o3 o+ U
       
    3 I2 T" ?$ J3 W& L
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)2 O- z% C! J% @% ^) }

! y% _0 v+ S1 z$ v) }2 M! ~至此包含tools的runtime基础镜像制作完毕。
2 ~$ ]( n' J9 f; @# m: h# l8 y5 V# C9 @, W6 o
dotnet-dump) k  ^1 y% y7 W, u  \

) f! ]2 J# A3 v/ t它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致) E0 z5 F( o6 R! \6 ]

4 D2 W7 z7 k( x  g( N1 `createdump
( D% G7 \& ]7 o# X. B- }  g7 [, L5 E1 x
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
( H' m9 ~& }, s$ Q虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误+ g$ Y) b  n0 z: U' R9 |: o
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下( [/ y! a/ \$ t2 B! A' @
开始使用:- }2 h, t$ j: X; N. V
        5 Z" L' _& Y7 P- R7 A3 Y
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)" O$ x9 Q: o( [
, |* ]  F$ ]' u) [, E& W
       
    . b$ |$ H6 j, b; b5 _% z% @
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    1 _1 G* _5 U, A; z: M7 H4 r- }
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    2 o+ ?/ B5 @8 @8 s1 O
# f, Y: W. q5 A2 s9 ]

+ G8 S& g) K! ]% G分析coredump文件% B; E7 E* A+ C) F8 Y$ P
/ Z+ N# D# o  q9 Z7 o& c
先将上面生成在tmp下的coredump文件copy到可以调试的地方
; r+ T& m% q. ckubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
* j$ b2 S' O1 O! a
9 Z( m& G% m3 X
然后为我们的coredump.1文件下载关联的symbol:% ^* [7 ]3 w% m' H2 o! e
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
7 `; M4 i( W" V2 z+ e
, S7 g& _: r: |  \& C
        / ^- b  ]& G9 J
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    # {2 q  j) U2 Z
  • sudo yum install dotnet-sdk-3.1
    " c9 I! _: v: g% @. d. B
如果dotnet-symbol没有安装的话,安装一个" c8 T' ^- v5 a/ ]& d3 C$ l5 w

2 I- M9 g* |  q. U
        % f3 T3 s  P/ ^+ b+ D) h' y5 v9 k
  • dotnet tool install --global dotnet-symbol    3 P* g! m6 M! w# j- m
  • 然后关闭当前终端,再打开一个新的
    / r7 N4 ^8 m- |; Z" e
然后执行dotnet-symbol --host-only --debugging coredump.1
8 D  I7 w" e* M: R  n
. h' u; |/ w' C+ z

' N" [9 \' y: b7 B4 A$ ]3 K+ R# I
        / M2 q1 h( c5 k3 B
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样4 l4 n% s) r2 X

6 M: n5 T& G; {) M6 s# l! J然后我们使用lldb进行调试
8 d2 p! S" B( {. j. I* ]2 I) @, h
        0 |. Z8 H$ f" A+ Y
  • 如果你机器里没装的话,先装一个吧   
    # q; V& R+ S/ d' i, ?
  • 安装sos插件:+ R5 R0 t4 X: `) }
              2 o. G/ U5 C* ]
    • dotnet tool install --global dotnet-sos        
      ) ~& i9 o6 y9 l+ x6 k% s
    • dotnet-sos install   
      4 _' u& s4 w# r$ d3 E1 W
            : f# D. Y2 c+ D/ O1 E8 F
  • lldb-8 --core coredump.1   
    ( y' S: n2 s. d' `
  • 然后就可以用lldb来分析dump文件了
    + `  j: N  p) E) A  d) y

" i+ G" g( Q2 u相关资料:% u5 n% W3 {3 y" P4 b7 R9 V4 ]' F
' P* |( b$ Z5 ^; t0 ]: k; q
       
    & l1 T) ~# \& F2 Y
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    $ {) p) x" o- y/ ^* H
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    & V1 `* {$ j: ^' w
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    - f, |2 b- d* G3 c
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    + j  J0 U* v6 E1 c# ]0 c
  • https://github.com/dotnet/runtime/issues/11012   
    * g; a& z3 M( g7 s- X) F3 n
  • 关于大对象使用的注意点以及官方blob gc的实现描述# `* N0 w+ h/ R) w$ q/ o% p# U
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!! c# t  _5 I. t" x4 s( X0 K, i) K

9 K8 o8 W! I% p. b/ d来源:http://www.jb51.net/article/232931.htm& T5 P6 g+ G, f8 w" @8 a4 V# n
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-20 17:49 , Processed in 0.040965 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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