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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6602|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录3 z8 }: v( ~* b- @9 i

: m: y8 @- x4 ?& G( w0 r# X
    3 z7 `8 D, i% [6 s4 C
  • 安装
      s* V3 L, A2 x1 w- n* d% z3 j
  • 验证
    4 ~; a, k8 b+ }! l6 _, ?
  • dotnet-dump" S5 F! |) o0 A" D- q
  • createdump
    1 X2 i4 {% K; A8 a* S$ N
  • 分析coredump文件
    : o9 @* _! h$ w4 A4 u0 Q# U
  • 相关资料:5 c# M( ?1 t( G, M

( b6 A+ r! u( Q: ?% c安装
/ Q8 Q7 ]( N; F1 a/ q& ]9 `. O/ t, N0 c7 B1 d
       
      q9 n% ?/ R6 K9 w
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    & u& C( A4 c1 e" ~! p
  • 准备Dockerfile3 E0 g2 w/ z) 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
复制代码
验证) M8 j( U: h# B% v: {- [6 {* F

5 n  k, \& f3 k& g  x6 F基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
9 }% N- X, t8 w8 |+ v) s" q0 C用我们刚才制作的基础镜像随便起个demo程序验证下
. z% }( ]8 j# b0 z+ C% K6 q: i$ {  L
        7 y) W8 i5 ]1 F' k' B
  • 已经包含了tools文件夹了,里面存放了我们的tools工具0 @" s  ^6 H, }! P/ N3 r, R4 J
4 l: B: g) {# L: m/ r, d( B
& i6 N$ a6 D% P" n5 B
       
    / x, H: z# p- I" U! I
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式); ?5 A& \& G- W+ K. B5 o/ t
7 c# o- K. c' w' F  d/ p& `  p
至此包含tools的runtime基础镜像制作完毕。% Y7 |' Y9 h  V8 G0 D: u
" Z3 ~# S3 I; I! Z
dotnet-dump
. P/ W) {' y0 \: G& `+ ^9 x
& G# i; i8 l$ c9 \# L它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致  E; N% o7 C* A! D: a1 N* [

) J  ^# Q' p, U4 K- z6 f# |createdump
. |) R4 K1 g7 c7 I/ m  j
& r$ h/ d1 J% c7 K它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法* L! E0 a+ O7 J0 S# N1 Y
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误: E1 ]; g9 ^/ ~3 H7 _
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
, ^& g' w& G7 w开始使用:
$ r9 m& @8 z9 ~- v( W. N* b
        5 q4 D% M, g" h! b9 i5 Y- M: A
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)3 F2 v0 b/ {( v$ o3 H; [) s* u, E
1 r2 {' N% c  v1 Z* [/ D
        ! @  K+ v1 J) w2 {# E- i" g
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    ! K, V' m% b% e: m7 ?1 A( \3 J7 a2 z
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    1 i1 u5 O# H& m* s" R

  k) i/ P3 s" V  Z, J; s: U# r' f. N0 \
分析coredump文件
- R1 k) E/ w, s. n
6 J; \# T9 x8 w8 W4 B先将上面生成在tmp下的coredump文件copy到可以调试的地方
) g9 L9 Z: M( G7 C; Ikubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
* b  m" @1 v* K/ V9 c3 ?

$ E6 @7 M! f+ ?6 r1 [, p2 x* t然后为我们的coredump.1文件下载关联的symbol:6 _) ^- X2 e+ I- D) W2 v6 }5 q; n
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把6 J( V1 I0 G6 C$ b. R1 d1 m, ]

& w( U5 S2 ?% Y1 s% L9 e
        6 ^: v+ n/ A8 E8 s) G5 x
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    ) U  M$ f  \! N+ n( u; u' q) @: C
  • sudo yum install dotnet-sdk-3.1' v+ w4 ?6 ]3 V+ `  _* i
如果dotnet-symbol没有安装的话,安装一个/ k; \, K; p" a' R4 h# A& G
* s0 |6 \9 A% }2 a$ @% ]8 s: I
        6 B1 P' y% {) }: }, Z  o
  • dotnet tool install --global dotnet-symbol    $ B0 e& E: @' M+ ~- j
  • 然后关闭当前终端,再打开一个新的
    3 a$ c+ U3 f, v& Q7 {6 h6 W
然后执行dotnet-symbol --host-only --debugging coredump.1& ^1 @  ~& B: T
% w+ H+ I6 |7 n8 Y6 n  ^
4 [+ J1 u; |3 I, |5 p% C# C9 F
        - D/ o' u3 Y+ k0 n6 U$ A) _. t/ B
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样6 i/ @# W3 x5 {. W
" v# x  p( h4 K8 r  P/ z
然后我们使用lldb进行调试9 R+ O% P; h5 {8 I( k# J

$ E) b2 g+ |# i( F
       
    6 D: ^" r1 C4 k7 z, P2 x0 U4 M
  • 如果你机器里没装的话,先装一个吧   
    . o3 o- F  ^! p7 D  B* p1 Y
  • 安装sos插件:6 ^7 D7 g9 j* ?2 B& U. g- @
              & m- }* y1 L% Y) ?8 |. O
    • dotnet tool install --global dotnet-sos        6 _6 s8 M7 M. s. K9 |
    • dotnet-sos install    , a0 \1 M9 K! t4 I$ U" O
            
    , m) w9 T, x& T) l  l
  • lldb-8 --core coredump.1   
    ) H9 v, O0 o; _7 o  V
  • 然后就可以用lldb来分析dump文件了0 ?8 a" ~8 e6 V  |
3 z+ J% J1 x9 A/ l- s$ h- N+ l
相关资料:
9 R* z7 ~! I# e) S+ K; `9 M9 P+ M2 ^/ ]
        & s& x* i/ W4 C$ d# K, A& f
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
    ) H6 ?- {' ^/ Q
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    $ X) q2 ^( S7 _8 J) I
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    1 @; w; e, j! k. W6 G. N( }' M
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    3 o: y! ~" A( y! p
  • https://github.com/dotnet/runtime/issues/11012   
    3 y  x: A+ a& U- ^3 O( s# \4 D
  • 关于大对象使用的注意点以及官方blob gc的实现描述8 _8 v. w% s. A: j* W5 _0 l
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!- m8 i4 K( _( E

$ L& Q; q' P1 f* n2 o' _2 r; ^: O来源:http://www.jb51.net/article/232931.htm* E' j3 B" a& @5 c
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-28 03:17 , Processed in 0.040281 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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