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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6656|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录
" t2 C0 s6 p7 S$ j5 J0 I' f* z5 d- U/ i2 \1 E9 j- |

    , p+ k, X* U% C! [4 ^
  • 安装
    + {" O  u6 c) Z  ^% X
  • 验证$ q" {: z* R  x! V2 Q; @, @
  • dotnet-dump
    $ n! Y7 D  w; A! q
  • createdump9 Z: f8 f- s; E
  • 分析coredump文件
    ' E+ z; k3 {, Y" F3 Y# g8 \
  • 相关资料:
    : G6 P9 r+ b, w* \2 _4 \, T, h
- M; I# B$ t( \- m- e- m
安装
, e+ B1 O3 C$ ^2 a! o/ @
$ [# B( J5 V, [: I. k
       
    - m' w4 g- t% D4 ~% v8 F% s
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像    % b) B' A5 T: J4 z. m' k! d
  • 准备Dockerfile
    7 e; Q. G( M% ?2 Z1 U
  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
复制代码
验证  ~$ W+ d- r- y- i9 \! B. d

" Z. w" l: |" k3 |0 A: P基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
$ {8 y  [) ^" N. Z5 \6 `: D. o用我们刚才制作的基础镜像随便起个demo程序验证下' E. P% P% _  g4 i3 J; A- U
       
    / G! j* ]% }% m0 u# ^% `! m8 l
  • 已经包含了tools文件夹了,里面存放了我们的tools工具6 E  S: S# _1 A1 s% M  D; L

, ]5 u: W6 C, J" Z* B
+ |8 H1 ^- N$ M; D6 Q0 m9 |
       
    8 p9 X* o3 d0 ]7 I" a1 F# _
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)& F- ~1 {9 p- @: J( Z
0 `5 q9 t3 L& z" l
至此包含tools的runtime基础镜像制作完毕。
% S' y: ^$ t+ |2 R( c. M- _  \( @* c& h. ~, t
dotnet-dump0 `1 W# g+ w# E! ^0 k

- j  r% y. _4 F3 G5 S; G它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
' j. C- o) w" Y0 a2 \+ w$ _' U9 K5 u6 E8 U- o0 x1 `
createdump
; A" a, N) @6 `6 H! ^3 t3 I' H0 X" P) P/ U% J
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法; A! V( B' X6 x1 m
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误% ^! M; v  ]% m5 l3 Q% }2 U
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
* t/ t2 P, a2 q7 n* a- `% O开始使用:
( w4 l! ~" |1 v
          e# x  F3 K0 G4 H- p" M
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    0 h5 b, P% X8 d) z5 p6 L
- G! b7 J* c' L, |0 d( e
       
    / ^; t( }+ ]' O0 I- X6 i2 A8 p  C! h
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    ( ~/ D& w% R1 X, ~* T4 J( B  p
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    * P# E2 x( H; W7 l5 \

  ]7 [+ d0 g; L% \4 n7 A. A7 t8 y; q  s) [
分析coredump文件$ u: F* q/ m9 Y8 \2 f. C
& Z4 P) S$ Y9 n( B# B, W0 G9 ~) ^
先将上面生成在tmp下的coredump文件copy到可以调试的地方
" j  l' Y8 n0 G9 [9 }kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s* Y  ^8 F- p1 T% N
# @0 _9 {* L' H7 W( `  j
然后为我们的coredump.1文件下载关联的symbol:
( J# ^) U2 ]6 U; l如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
6 |4 ?. p6 [% d/ |
# J2 f% v" x" N$ }
        2 {- `, \, r/ F# e' X1 D7 P' A) U  z& h
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm   
    : e7 f8 W  v; r# A9 J; i8 b* o
  • sudo yum install dotnet-sdk-3.1
    . v! f2 j& d: e/ K. U7 j
如果dotnet-symbol没有安装的话,安装一个9 a9 v( t. W& y0 p& d. G
+ L/ `& b; g- o: L  o
       
    8 P, L: o* m' i% O! a( L9 R
  • dotnet tool install --global dotnet-symbol   
    " E) Q1 i# g; I- y. q% k
  • 然后关闭当前终端,再打开一个新的
    , C/ O% a  z, E: h
然后执行dotnet-symbol --host-only --debugging coredump.1. G/ ?- T) ]* Y3 C

4 c% g/ P% p2 ]1 Z# J

9 I% Y9 L; P; \. Y9 C
       
    8 u" L9 ], F- q3 j& W+ j
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样" \  z* e6 i* q9 V% j$ W
/ ]1 I% {! W. M& b* ~, D' N4 I
然后我们使用lldb进行调试# Z3 f% D# L$ b" [$ J

) H' A8 n6 }5 X. c5 N0 j$ z
       
    + k+ Q! v5 K* S6 {5 g" `; h: C4 ~
  • 如果你机器里没装的话,先装一个吧    ; g3 ^: T7 M5 G  M: ?8 i
  • 安装sos插件:
      y$ S7 k+ C4 ]- |+ \/ |
              / R% u1 Z/ Z. A: B& X- W3 Q
    • dotnet tool install --global dotnet-sos        
      / n2 f* h1 }  ~* x6 d0 v
    • dotnet-sos install    ) w( ~. m1 l. ?0 O' ~
            
    6 ^* n  w# ?) q+ Z, _$ x
  • lldb-8 --core coredump.1   
    , d  f; O: D' V  U. G, `% C7 K% W
  • 然后就可以用lldb来分析dump文件了: `2 P2 s' `. h" s5 h

+ I% v6 G* S% W) o+ [3 Z相关资料:& |5 g) p. h2 h. P# b
7 A5 Q3 T' z- A5 |; H! K
       
    3 g! A! n* v% s# L1 I5 _" `
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    ; K) ~; G0 ]/ t8 x4 w/ v, Z  J
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    + A1 O( l/ b: V: D, F. y
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    ! N" j/ v9 `3 e% U  v! m
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md    & D6 `+ |' Y( G8 {6 a+ G
  • https://github.com/dotnet/runtime/issues/11012    ) z7 e% b6 U0 f0 M  K
  • 关于大对象使用的注意点以及官方blob gc的实现描述2 @1 P1 r" r/ b/ }* p- Y
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
3 Q6 y1 Y/ H0 U  ]
' R. F5 g: k6 X. u0 M来源:http://www.jb51.net/article/232931.htm6 N  o, ]/ f) s+ \1 [; C
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-19 20:07 , Processed in 0.040346 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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