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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6634|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录  _6 E) c# D9 H; l$ ~4 m( |. }

1 y  p" f0 G+ ^$ d! M0 m) f8 R9 Q  a
    # W4 f( @5 ^- A7 t, ^
  • 安装
    2 e# E. _' G% {6 e' O
  • 验证
    4 R# E4 x+ E7 w# Y; t. @6 d
  • dotnet-dump+ d" J0 }: m0 b+ p- J
  • createdump
    ! G6 T! s5 N, q5 m9 q3 i# G3 B7 {
  • 分析coredump文件
    " A5 k/ m. D2 f3 U5 N: Q6 \& F
  • 相关资料:5 Z( R2 V" E3 O, A
! d' Q4 e) A) x  ^7 W
安装7 ~4 g3 v( k5 w# \% w
6 \; N: T, U& R: i/ _
        - W# S. @/ ~$ R# @. c3 u: ]
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    " \7 v3 C3 Q" t: W+ m' _# K
  • 准备Dockerfile; s- `' }, b7 W: ]5 D. 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
复制代码
验证
3 Z4 @: }- k' U  J# k; i) t  O4 F/ k3 G
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多8 e2 [: f' g+ m, w
用我们刚才制作的基础镜像随便起个demo程序验证下- @- d% J) ]3 z
       
    6 W, z7 j( X5 m4 X- M
  • 已经包含了tools文件夹了,里面存放了我们的tools工具0 o. z* L3 z& \7 u
9 t# J. u1 h! Y$ c

/ d+ C  f$ A+ c7 [; g
       
    # f) [( ^+ B, Q# N2 q( d
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)3 z' t% y& _0 p5 _* R. M6 N
9 u6 O' i% k* j" O5 c" b) a& z
至此包含tools的runtime基础镜像制作完毕。
, e6 w: |2 A) Q  U! X* I' K6 r7 g) u
dotnet-dump+ J- d" E$ J! r
3 _$ W" W- ?4 e! M  j6 Z' N
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
" v( A0 G9 W2 T3 G. }/ g5 y! s3 Z1 g" {
createdump& w8 b/ a( W- U
* v' k! c8 v5 {4 u' s
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法. Y% {, A# p! c
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误/ c5 c9 o, _) F- A
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
: \# Q! @: m6 i: t开始使用:
0 u, ~9 l$ C* P" D; a# }
       
    2 z0 n: G: X& O( J) H
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    1 }& M+ y& D/ p8 `! d: t

) m. T# O) q8 v/ b4 X1 X. I, N
       
    3 l. m* X& d% ]- c+ `' `) `( V5 \
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    " [4 G/ ^9 q' [% t$ V
  • 如果报权限相关错误,可以在你的yaml文件里加上:- b, u0 h& |* s' }: j
8 z6 I1 y4 {2 \: R/ W

9 r0 W( Z6 ^, I* \" R分析coredump文件
# O) X1 t- h% ]# D% o+ `
" h1 [* ^% L0 n1 w, w先将上面生成在tmp下的coredump文件copy到可以调试的地方
+ q# n: M( \& x2 f( E# Hkubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s' r( x+ r6 S6 f2 _- l: w

2 `8 n5 O5 T9 X) J. c5 d然后为我们的coredump.1文件下载关联的symbol:
0 a: g7 g' Q5 o  z如果你准备分析dump的机器没有dotnet sdk的话,先装一个把! b$ ]7 `0 m; x+ D

4 B( q6 D0 T# H) A5 l0 L
        ; W4 w1 H/ p$ Z
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    2 q- B- r% [2 U% H* Y/ M8 C2 Z% z3 O
  • sudo yum install dotnet-sdk-3.1
      L) b' t3 R- x7 W# m
如果dotnet-symbol没有安装的话,安装一个
: t# \. d' Z% N' I  W4 l/ E# I( V' C, O& e4 F
        ' J4 H3 r1 c2 i  q6 t6 z
  • dotnet tool install --global dotnet-symbol   
    / V: k& p2 e3 K$ ?2 [
  • 然后关闭当前终端,再打开一个新的
    3 E/ r9 J+ ]0 F9 t% ]
然后执行dotnet-symbol --host-only --debugging coredump.1# u4 W  ^" f4 ^. Q
, j5 t$ w7 l( D. n/ J& j3 a4 _- r

! f5 A( v$ j8 }) L; q
        9 f; x3 O" D: H& V' q
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
    7 Z4 S8 M2 h* [* S$ `& {4 m, I6 |- G

1 h$ \0 v% [  O; `2 y然后我们使用lldb进行调试8 b3 |0 \0 m- P8 Q( t! ^) {

1 ^6 U3 Y" X) K/ u
       
    8 c! @& G# N: c" m5 Q/ p
  • 如果你机器里没装的话,先装一个吧    + d0 ^2 I; J) l, r  p4 }, i
  • 安装sos插件:
    $ o, M. H) e, L; \! a
              & [; t: \* U+ j2 R! b
    • dotnet tool install --global dotnet-sos        # D: T0 N  H1 {; A9 Q/ A
    • dotnet-sos install   
      ! i0 H5 z5 f; e
            
    " j5 y& }1 f% @2 Y) k3 @& i4 H1 v
  • lldb-8 --core coredump.1    0 {0 P& _* i* }# L7 M' B4 h# k
  • 然后就可以用lldb来分析dump文件了) E8 d; d6 e$ q

5 X/ k, x8 y* x+ o/ g7 S相关资料:
; a6 i+ t# a. ~5 H4 P8 V8 b
  C2 _" {0 j% [6 L1 i: D* a4 r. ]' G% k
       
    & J3 G9 h% l5 t: q" C/ C
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    0 H0 f- \  R1 b& m4 y* @3 b
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    + h  O7 a' ]' }- m/ y. M
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    5 r+ B, W  d/ _) ~* D5 t0 g/ S. j
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md    ) F0 K9 G2 `) w8 T
  • https://github.com/dotnet/runtime/issues/11012   
    / [( c6 t; b8 N6 i6 b9 I
  • 关于大对象使用的注意点以及官方blob gc的实现描述: o& T% e! d( z* {( i  r2 Z4 v
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!6 v! q# ~* T+ l1 ^; b  i2 {
0 P; E7 m' d  E1 Z# _
来源:http://www.jb51.net/article/232931.htm
4 }* d4 [9 A/ {+ O免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-23 22:22 , Processed in 0.038137 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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