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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6627|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录: B% J/ }8 w# M: t/ K

2 J# W& a' x) X% V* w. a' @" |

    1 M: d- y9 n' g, `
  • 安装
    % z# C# ?: H' B/ W' s% R
  • 验证
    # q" `  ~0 J4 d) j3 @
  • dotnet-dump
    0 B. V1 E7 W( }! y5 X* y& P
  • createdump
    5 o4 z3 O1 d7 R: ?# {% ^
  • 分析coredump文件6 s  x6 U2 M6 f+ o( s
  • 相关资料:: O, `- z' _! w. p" Y, d. `

4 i) x, l; f( B/ A: m# L- q安装
+ \7 H8 w* ]' G! O6 |
' M/ D) S9 h7 f% j7 o- W
        / ~3 K2 A+ \/ H% q, g  q
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    , w: G( |3 X/ Y! W& g
  • 准备Dockerfile
    5 b& F& b4 h% l
  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
复制代码
验证4 {, B1 A' \$ z! L

+ o9 P) C' E: \1 z7 K' d4 X; a% m  {基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
" K" z/ w! Y/ x/ x0 w* W用我们刚才制作的基础镜像随便起个demo程序验证下
! S3 ^$ T! V7 Y. f2 c( \( n
       
    / Q! P3 w; a( Z
  • 已经包含了tools文件夹了,里面存放了我们的tools工具; `/ B, p8 Z! n( U

1 M% e5 Z1 U& u
- n: z! M; h& c
       
    ! b6 y/ Y$ ]1 M
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    / V  e1 j. i, b3 n2 c

. p% [3 o  o* Q8 P$ K至此包含tools的runtime基础镜像制作完毕。
" q+ {/ t8 p% H/ Y# L& A7 R. \% V
: c! O# J) V" F. ]0 h5 o2 _& sdotnet-dump
% I2 F1 ]: c% c' P& ~9 a) p0 b* `3 k' E- [
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致8 y, ^$ ~# T0 G& T* O+ d
- t2 \7 a4 D8 {$ r! k7 j
createdump, i# y4 M' [+ y

7 \! d) D' m- M- C% ]# ]它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
& J9 w) K+ w2 b. C& r: T虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误9 K5 I  I' ~- J9 \& ~) r0 j
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
" T8 ]! i! D; U$ Q开始使用:
8 Z. u. `; V+ v2 ]1 \2 \
       
    ( k8 s1 @) X, j* {# U* e4 }
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    * I8 k% _6 S0 M. U: j
( k+ ~4 t- w( X& m$ `7 A$ k$ \
       
    & K  X4 R3 o6 L% s8 _  A- n; f$ c
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    , A" u7 k+ w& m. \$ z0 I5 L! Z" M
  • 如果报权限相关错误,可以在你的yaml文件里加上:1 B& r- X0 P, x0 }; X) O+ ?9 `' g

% J/ ]0 L$ C+ |3 d2 b, k: H: K1 @' b$ v
分析coredump文件9 S( k, S% @. a  d

' g9 m! ~' h7 @/ X先将上面生成在tmp下的coredump文件copy到可以调试的地方  R6 w+ Q4 m; V
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s) @+ H2 [% @" Y. |5 Y) c/ U/ c! m
$ i1 E2 n/ l% _) S9 f" `
然后为我们的coredump.1文件下载关联的symbol:2 y! ]& w) i  N
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
/ j1 j# {% |# z; D
+ s/ c( c; T# H2 Q% J. }" V) ~
       
    , N) o( s' ?! x. G" ^9 @9 h: N
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    ; g: w0 |! X/ R- r4 j2 c
  • sudo yum install dotnet-sdk-3.1
    + K+ f5 }/ N/ N% g& Z- O
如果dotnet-symbol没有安装的话,安装一个; A1 h, R8 l7 z( G! B) O

( {) U9 o4 U# J& h9 V( K
       
    : I, q6 Q+ |7 V
  • dotnet tool install --global dotnet-symbol    ) p+ Z+ r/ X+ r7 H/ ^& `( I
  • 然后关闭当前终端,再打开一个新的
    4 m/ ^' o7 `* q( i3 f) |2 H3 B
然后执行dotnet-symbol --host-only --debugging coredump.1# Y2 W2 q: T! Z7 y; K
- B  T3 v# {& n+ x. h7 A& o7 x

. t$ k1 o3 E# y  B4 l1 M
        ; ]) o7 D) j" `% w0 ]8 e
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
    ! q/ X! r' r) z4 S

! \: p5 `4 D9 {然后我们使用lldb进行调试% t7 ]$ M( G) \0 Q, p6 ?# B* Y

& x. I  v# g/ d$ Z
       
    0 P' l6 e/ p$ v
  • 如果你机器里没装的话,先装一个吧    * l% A6 I3 y9 y$ U* D+ j
  • 安装sos插件:
    : m% @/ o6 C# T* f9 N
              
      % r: n; }' G2 u/ u# m! b3 c* X
    • dotnet tool install --global dotnet-sos        ) E# B; D! D' k
    • dotnet-sos install    5 w) {6 D: O5 u( o; z7 t' n% k
            : ]! R/ m! F) ?2 }. W: b
  • lldb-8 --core coredump.1   
    2 n+ w8 M% U3 u
  • 然后就可以用lldb来分析dump文件了
    , z1 A8 P' `: }  ?

6 S4 c4 N# k) ~  R3 B, y5 W相关资料:! E5 j5 |* R( z3 {- ]
  t8 r' U& C& i/ S* k. t
       
    / k& d! ~. J0 f: y! {/ ~( N
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
    + e% ~' l$ v: E9 f& s
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    & n' {7 G% p. z  _/ X$ }  }& g6 n
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/      @% n) m, l" c5 _9 I
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md    " I! A0 Q; w2 {5 z% I: R' J
  • https://github.com/dotnet/runtime/issues/11012   
    $ \8 P; y: a' S3 O  Z
  • 关于大对象使用的注意点以及官方blob gc的实现描述
    , D! w# v/ o5 m1 W0 c2 U
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
* A& [! }  Z, y- h2 f( }' H* d6 E# ]0 F* E* m% b4 k
来源:http://www.jb51.net/article/232931.htm6 ?0 I$ ]5 B. M4 j; }5 S
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-25 23:34 , Processed in 0.042984 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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