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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6590|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录; M7 J7 _/ q3 C8 k- s

3 d6 l; t7 m, }2 [# E/ F
    / F$ I( w* a" d- `
  • 安装
    . F; U* h6 R/ Q1 Y9 q1 Y
  • 验证/ C+ A1 \1 w0 O! D6 B" ^
  • dotnet-dump
    1 `  V9 z$ d7 N
  • createdump" D1 p& I5 \4 I7 Y' j' j
  • 分析coredump文件
      _1 D; r/ w- @; R) X/ ^8 i
  • 相关资料:' H" ~5 L/ U2 g) R$ J  f9 r( a  g
& Q5 s5 K0 T$ j1 _0 j" a: I
安装
3 m' a$ T, T. _; `: W6 D/ M
4 B( U8 _! |" X* o4 x1 o" [
       
    7 ^0 c& u  z0 _0 v* L
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像    & z. w; W( u, ~- I, |- A
  • 准备Dockerfile
    - Y- g, y% M' h. \8 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
复制代码
验证5 q$ L4 i+ P+ n! n$ s0 X! ^+ i$ {4 R
6 u7 N! u' m7 L3 ^& d
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多5 C/ ^/ ]5 r1 g' v  p7 l. F4 H
用我们刚才制作的基础镜像随便起个demo程序验证下
  k) K' i1 {5 x/ y) V9 k# p( X5 Q/ r& ~
        ' N9 m$ U) x  ]+ Z8 a2 ^3 A+ l
  • 已经包含了tools文件夹了,里面存放了我们的tools工具$ ^* T# n) h) F

1 _, B6 e6 a  _
* Z# y3 d, ^, ^( W9 Q3 \, @. P; t
       
    : }4 h7 [# O2 f: A$ \0 v2 W/ T
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    1 M0 |( F( u7 ~, K0 [; Z" E* B- b
: s! _) S; p+ s+ W7 Y
至此包含tools的runtime基础镜像制作完毕。7 \1 n" [' j/ \
3 W! D( P$ }# a/ x* n
dotnet-dump( W4 J# b; Q0 t" |+ j8 ~
. K8 _: Q+ A+ X# [+ E5 S
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致) k$ T  p( M8 k# f8 v
0 E7 k; s! U, x* l2 x7 H9 t
createdump
) G" ]( a% n9 e0 n
! j" S) E; C( K' Y它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法' x4 P- b4 u+ n6 P
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误' T5 A, k+ }3 y' a
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下/ [& F* @2 N3 l) Q
开始使用:2 g" X4 j# T  O0 y$ d6 l% _
        $ B" y; s( \- n( P7 m( P
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    $ y8 U/ T4 J4 ~+ |, o

. U5 q! U8 ~, y6 Z6 b
       
      n3 V9 \/ z8 I- m: r
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    # L# Z' B- O7 ]  r! F( O5 c
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    1 Q+ u  v  i0 H" W9 q  D. v

. ~, I: ?& ^% P- D0 E6 t- Q" P0 [* c4 w! L  y# Q, t! `/ @
分析coredump文件
5 m8 W, p* K! V) W6 T# G8 I: O# L1 }, B- U% K. p0 b8 \/ s  T5 O
先将上面生成在tmp下的coredump文件copy到可以调试的地方! ~# o2 c. Y$ [* D" Y; V" S
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s( n$ P2 H" x3 I$ X

& ?1 _1 o6 M! F然后为我们的coredump.1文件下载关联的symbol:
1 i' o* l7 a3 L2 [* Q如果你准备分析dump的机器没有dotnet sdk的话,先装一个把2 V) j' {3 `* c9 |! `  {) V

. p; A: b, @+ O3 n
        ! S, K( W. T, R' v6 b: \
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    . O* R9 y6 J8 ]3 n! j) u3 |
  • sudo yum install dotnet-sdk-3.1
    - i" C3 w, Y2 \  M
如果dotnet-symbol没有安装的话,安装一个
4 E3 n/ R8 E& o
7 N, d8 k  i* o# I; L+ t- K
       
    3 }5 v' c7 j1 k! c7 W( A% o: ^
  • dotnet tool install --global dotnet-symbol   
    ) p8 w$ T8 v, P3 `0 x. h  ]
  • 然后关闭当前终端,再打开一个新的
    : F3 w, M# ^* A0 T, E
然后执行dotnet-symbol --host-only --debugging coredump.1* I5 B, t& m; H2 D0 x

% n, C3 C/ v" T
/ s* n7 ^& g1 U
        ; i3 r% [) N+ o3 w3 E
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样4 q/ Y% v0 n1 R4 U
. e; M0 \/ O6 J. ?* y
然后我们使用lldb进行调试0 ^/ W7 v$ q2 ]7 p: f8 y0 i
: P8 t& \* u) V- h0 P/ H# v+ j
       
    % n) M( K3 t% B( k0 Q; p" X: d
  • 如果你机器里没装的话,先装一个吧    4 w8 @% I# H  Y' V# X* a9 O1 T
  • 安装sos插件:
    8 ]4 k5 X, C( W* U
                B: c( V& ?: Z: Z" V" m
    • dotnet tool install --global dotnet-sos        
      " }5 S! v3 P2 w2 v4 U' R
    • dotnet-sos install   
      7 I  e& O! V8 |& z; w* M
            - X! C& {! q8 O/ b) _% m
  • lldb-8 --core coredump.1    " y3 l- l2 |* D) n0 A, h
  • 然后就可以用lldb来分析dump文件了
    / q" O) f% e% L' D0 z& E) R

- [, Z1 j" S  \9 P相关资料:9 `% q' o  Q; h2 h' s
. g$ ~4 D6 S# j
        * K3 V" d4 i5 J, t; ~7 q8 \
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
    " R  n" s: S4 i0 F; I
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    + E+ w, N+ d% M
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    % ?& e7 t+ T) U! V! k% k/ s
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    7 T4 k1 T6 s) r3 B3 S8 {( _
  • https://github.com/dotnet/runtime/issues/11012    ; m' ?4 H: e# b' ?
  • 关于大对象使用的注意点以及官方blob gc的实现描述3 n6 _. q& p0 D0 T
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
3 ~0 A' w$ d5 e  E/ K* E3 R1 S4 q4 k) Y9 V2 m0 x9 o
来源:http://www.jb51.net/article/232931.htm# m3 @( U! U6 m
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-25 10:53 , Processed in 0.038140 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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