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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6559|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录
$ Q) C- N. b4 S$ u' W) [7 T
& J- i' `/ A: I+ i
    / r- k2 @; ?; [+ q" a& `
  • 安装. k( N3 |% D8 Q7 P4 r0 i
  • 验证, b' r) m1 Q& c8 X. M4 N! W6 w
  • dotnet-dump
    : o3 C" y, F) T( `, O
  • createdump) F+ f1 o8 C5 ?
  • 分析coredump文件
    " \3 r) Z% k0 X4 i4 {
  • 相关资料:6 H* U/ ?# B2 [

+ V/ p- Y3 ^% t: `/ B1 W1 n安装" @! |5 G/ U& A6 Y' I& N
0 O( }# }! H9 ~: {& H: }5 S0 ?
        9 ]1 M, U0 S$ s3 W" a" n2 N$ `
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像    % K6 m, V) `, M$ \
  • 准备Dockerfile* {' I! C9 c1 ?% t! s0 j/ u* C% m8 s* f
  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- Z0 c6 l0 A$ J* L; q# z
3 a% V2 q3 R+ i2 t  S基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多# d9 Z; a+ x& {5 z  f1 x
用我们刚才制作的基础镜像随便起个demo程序验证下
- s$ I# ^( C& f8 K- c) N
        4 Z5 g) p& @# V* M) M7 n& O9 s
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    5 n% A0 W/ c, W% x9 Z

2 y) {* y' _  p$ U$ g. F* O
( \" w- l0 \' @+ y" f: v
        1 I" A  }  u: d) c7 C6 X
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    ' _  }9 g+ O( k; U) p. _& J' B
  l; @' J5 g+ k( V4 W: A' m
至此包含tools的runtime基础镜像制作完毕。7 o: ~* H( V3 m- U

9 P, t0 p4 M3 y. G/ V' Fdotnet-dump) ?7 s0 V/ k5 w4 \
7 |7 D. ?2 k5 N. _
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
- J, l7 K9 j( v; v2 Y3 J6 O+ ]5 z5 m
0 L8 d# t3 ?% Ucreatedump
+ ^5 Y8 E# ]% Z3 ]0 O+ j* I2 R" e  }
; L2 R# G1 F6 D5 ^" @8 s9 _0 |它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
5 W; f5 x' A! F5 {+ R虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误) V6 D# E% a9 r" J
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
% g& x( O9 r  [9 q# B/ ]开始使用:7 o4 S4 J, H& R8 K$ X
       
    ) ^+ E- ~1 |" y" |6 E! r
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    ) N0 ^3 j8 W2 z9 e. O$ i

3 {& N! }3 a" H, Z
        ( R8 k/ }5 E+ {2 Z( a
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    ' d( ]1 S5 e1 ]
  • 如果报权限相关错误,可以在你的yaml文件里加上:9 y. p! q  V, y4 Z: R
) Z+ I  z% v: n- x
4 ^; h! N: q! f2 w" N0 E" Q
分析coredump文件) e2 m* e" u9 X
' T/ w- N$ I" k4 }. O
先将上面生成在tmp下的coredump文件copy到可以调试的地方# o1 @6 C  |9 F/ h/ H
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
+ ~+ g% X, c+ \9 V' s9 _# T$ i
9 y! e- }5 Q3 }3 y
然后为我们的coredump.1文件下载关联的symbol:
: }- y2 ~. j8 }$ p4 @) w! _9 d# e如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
5 W2 ~& _! [7 m/ ?) A) T4 K6 k8 a0 b8 O( J5 w, f3 Q
       
    , A- c8 {2 h, Z0 t
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm   
    & M+ n1 T% j* T; z, A% @* J9 O
  • sudo yum install dotnet-sdk-3.1
    9 N6 c8 q- I: w9 v9 W& Q
如果dotnet-symbol没有安装的话,安装一个
4 C4 k8 j2 M4 e; |0 M1 G# k
4 t, K$ [. p/ D1 ~4 H) y9 p$ H
        " \! h  n8 n+ A4 Y1 ^7 d
  • dotnet tool install --global dotnet-symbol    6 S- \0 e) c" ~
  • 然后关闭当前终端,再打开一个新的
    # Z6 i" m8 d! }  o% V! d5 ~1 q
然后执行dotnet-symbol --host-only --debugging coredump.1
; ~! X7 V! \& R; F' J5 D) A6 Z' S" q( N; `

2 n- ?9 ]2 J/ H2 ~5 ^
       
    # h$ N5 d6 e7 T) O
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
    ) N# x1 e$ |8 q+ B. Y

& S' r& f. L2 k- p- v! `然后我们使用lldb进行调试
( G0 x6 p' l! w5 O& k7 d9 T
  x8 N* s: [9 u  A& ]: s" |8 G
       
    % [/ _* C& [3 U% J8 g3 Z: \1 _  w
  • 如果你机器里没装的话,先装一个吧   
    , M4 u: L$ [! r5 v9 l$ S
  • 安装sos插件:* ^  ^/ E9 i& z  @# @7 Y, S) r
              7 V: j9 X0 ?% H# M' E+ N
    • dotnet tool install --global dotnet-sos        
      ( o. X2 _! G' y8 Z5 T! g# c
    • dotnet-sos install    $ E+ n8 {5 z# U* L/ Y
            7 m- a: z! N4 _' T+ k
  • lldb-8 --core coredump.1   
    1 f0 k* [7 K: X( z1 l
  • 然后就可以用lldb来分析dump文件了
    0 I0 R) |+ u% k
* u: E0 Y+ p! x8 E4 i0 d* }3 {
相关资料:
9 _, p  v, {& Z3 A2 F. n" L4 [7 \6 [9 T$ L7 `; l% ^5 X1 e7 _
          w. V5 M2 V+ r& D! Q1 o  U
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    1 l8 p8 ^) G0 ~* I8 Q
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    - }, o3 ^# h$ D' ?8 L. ~: _/ l
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    , n/ y8 d& \8 L; N+ S
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    - }7 t6 u" ~+ r7 d5 _
  • https://github.com/dotnet/runtime/issues/11012    1 }- f6 F/ ]; O/ F' f! k# L# ^
  • 关于大对象使用的注意点以及官方blob gc的实现描述2 H' j. {( ]- _2 P) C, a
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
  G7 @/ I- i6 l& d! T% W+ O: p0 i. v  A5 U3 B0 t- p
来源:http://www.jb51.net/article/232931.htm7 t5 J' e7 c, n3 e0 E
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-12 06:43 , Processed in 0.038920 second(s), 23 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

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