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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6593|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录9 S  w2 w4 G* a
% y) |3 A! p' @+ l6 Y8 M
    % }% k+ v$ U  k3 A5 i2 j1 X
  • 安装
    $ [5 G5 ]0 q/ j4 ~: ?: ?1 l
  • 验证
    ' y( ^5 K9 T% U8 E
  • dotnet-dump
    * r) X# r/ F4 d+ g
  • createdump1 H8 [# R7 {( v* C
  • 分析coredump文件8 e  @- i& r9 H, w
  • 相关资料:, ~; W; e: X; Q- [# a/ B
! ~4 G$ C6 u, g% ]3 i9 R
安装
9 V& a0 H- X6 P8 P) |0 X8 }" s+ L- H( a1 a, l% a% ^4 H. Z
        : R9 O+ ~. d  d# g- n$ U
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像    $ _/ y, n( M3 K0 a
  • 准备Dockerfile: X( b; [- F1 w
  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
复制代码
验证6 t5 j0 G# R( \2 j: K# A6 O& d% C- r
. K- ?! i7 W1 Q) U9 w9 p+ Y
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多+ r* B  h  ]+ B; d5 |
用我们刚才制作的基础镜像随便起个demo程序验证下( G1 I% @# s; B$ E6 f  ^
       
    3 r2 Z+ ^! P4 p/ o6 p9 f; P! E
  • 已经包含了tools文件夹了,里面存放了我们的tools工具; k! l, t' q3 \7 i; Z. k# v5 R

5 i1 p2 E/ X( y& F) G' b
7 n+ w: q$ w6 Q$ N0 A0 V. ~6 m2 B* E+ ]
        ' V7 ?! o  a" _% |: Z  Q2 P
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)% W9 C6 m- \, ?! n. F) Z% X

9 t# m% I; h* T, ^! m至此包含tools的runtime基础镜像制作完毕。5 D% d- ]/ k* Z, s7 \

# @6 ^" p) Q4 |' |1 r( Zdotnet-dump$ \5 I; P1 o- J
. G# P, m- T) L- R
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致( y7 S8 B+ k) M; ]- s
: r% t& h% f$ {7 R, @1 w
createdump4 y/ r( c: [1 n. |

) m7 R8 X8 Z2 U8 E6 l: r% c1 H3 F它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法! ^' i4 ?6 R* |! L+ z6 ~
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误5 ^$ R6 ]  c: F& f1 Y# \0 q
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
( A+ d3 Q0 F5 N; k  T; p开始使用:
8 X" r: @9 Y; |% f5 C
        * @" z- S% }/ o4 b
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)* {/ \, R' ~$ o8 g
& ~4 T# O' _9 J
       
    ! l$ F/ K9 t, i# d
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    - }- C* [/ z1 @
  • 如果报权限相关错误,可以在你的yaml文件里加上:$ {- R- S. D  F: ?* p% r
8 \9 O2 u' b( m7 j, J5 m  q: t
# T- k; O6 O# |
分析coredump文件8 S$ c4 n# N& N# s0 H) O  X

3 @: J/ }4 X5 v. ]9 h/ x( F: d先将上面生成在tmp下的coredump文件copy到可以调试的地方8 |7 r1 @3 r* W* }8 ]( J, ^1 c1 t# t
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
; }1 ?9 x1 P* y% g, x% O

* V+ H* z/ t- L+ w然后为我们的coredump.1文件下载关联的symbol:
+ {4 V0 m* [( R+ Y# D# ?: C如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
$ {' @! D( X; _/ I8 @( }% z; s" ~: D3 O9 y7 c  f5 ^  [8 L" z
       
    & Q$ L( Y6 m: d5 q* X! I7 z
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    & E7 A1 g. j% M+ r9 _8 i
  • sudo yum install dotnet-sdk-3.10 }5 b# z: Z2 x2 `5 \. k. p3 t
如果dotnet-symbol没有安装的话,安装一个
. O9 w; F" O* c  x! E/ n5 N3 \; W2 o' r# m! z
       
    - X0 b9 q) d, N3 @* U
  • dotnet tool install --global dotnet-symbol    ( }6 _9 Z  x" v
  • 然后关闭当前终端,再打开一个新的
    / W0 ^; f7 j* u- ]
然后执行dotnet-symbol --host-only --debugging coredump.1) f% z% t! h* i/ ?2 Y

6 ?* }, g1 Z1 Y2 e2 _

5 P+ I. n9 a/ a  J- @) i- }* j( p+ n" D; z
       
    2 Z; y) y5 }0 j9 j7 c
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样# Y+ p; s) L) b; e

- z' q/ b2 N1 F9 _: y然后我们使用lldb进行调试
' P3 }" @# m; [! S+ _2 ]9 m
7 K/ ~8 W" J; A2 u: U; H- @' r
        * k  ]  T1 W7 [
  • 如果你机器里没装的话,先装一个吧   
      `5 D$ G! d; A& s
  • 安装sos插件:
    9 V/ V8 O: }  C' f; d- q$ @' ]; c
              & }2 _% h" _; J% j- C0 y3 ]2 C6 P9 |
    • dotnet tool install --global dotnet-sos        ! p  E& D6 r; H3 W/ J5 ^
    • dotnet-sos install   
      * d3 C+ [8 N! C. P# E
            
    7 e  ^% Y8 }7 h6 O
  • lldb-8 --core coredump.1    ) ^/ l5 G  p- X( R3 w7 a: g
  • 然后就可以用lldb来分析dump文件了; n6 B6 Y0 U# f( a

/ y/ F# i" u  o相关资料:; f$ y' C5 C" |

0 s% a  a$ r8 r. |) x# O# K# z
        ) Z7 P# S& v- `6 s
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
    & P2 g' V2 x0 O& w7 ?# Z: P$ A2 C
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    2 F1 I0 T0 |( A$ U
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    . B) P( l" |4 P# o0 i' u; G
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    - u9 q( i9 X4 b9 I1 ^- e
  • https://github.com/dotnet/runtime/issues/11012    " N1 c9 p! X( o/ i$ V
  • 关于大对象使用的注意点以及官方blob gc的实现描述
    8 n- T! M9 n: }4 z  g0 D( M# D9 O
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
0 g; m, H7 D4 A
+ q6 k* ]6 R: }+ o4 \& k# U  |来源:http://www.jb51.net/article/232931.htm$ T0 I, H& G( g
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-25 14:05 , Processed in 0.041259 second(s), 23 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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