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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6556|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录
3 G/ H7 r0 O" b* l# N
7 L! `  w# W1 b9 o/ W$ A
    . t! w4 |3 H( v: g: v$ P9 ~- o/ W
  • 安装
    7 E7 v* y7 s$ G7 g  |+ N
  • 验证
      ~: O+ Q+ O( X* f( t
  • dotnet-dump9 e* P- n6 F) B  h. v
  • createdump4 e/ I7 a' [, P) d/ k4 D
  • 分析coredump文件
    " g* s1 a9 j! \1 L: ~
  • 相关资料:7 @5 G  i0 c5 I6 Z6 U  T3 t

8 E5 Q- [  Q/ J- ^# b' h' D6 p安装0 {9 L" ]) {* n0 ~" R
' R+ L; N+ `1 n
       
    9 n/ Y) K2 A% J" f, o* p
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    : i5 f* b6 Q  n  h- m/ W1 j$ O
  • 准备Dockerfile- X/ Y" m, b/ p( t- L8 h9 y; c
  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
复制代码
验证/ `2 D- v$ s0 S; E( d
  e& r! g0 p3 E5 D
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
' D5 {7 t- h+ l+ j# `6 {( m用我们刚才制作的基础镜像随便起个demo程序验证下. L; o5 r) i6 }# p. ?
        ' D2 S+ t+ g' B8 {' o
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    0 n& p5 w( ]" F9 ^- W

, ^, X; [5 q4 _

* p- ]0 T$ N5 ^7 L2 X
        4 K: I) s: F6 j+ `0 k4 V, y
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)5 {  j0 h3 w4 G5 s4 \
7 s1 V/ o7 y; O' i
至此包含tools的runtime基础镜像制作完毕。+ d; ?& j+ B: K( b0 T

, U; [/ L- @* W9 v: Tdotnet-dump7 Z/ v7 q; }7 C$ ?3 Q" a
8 G. s/ u+ m4 p/ i% x7 ?# E
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致/ a& I' V2 j! ^) m- v- i) r- o6 E) e
2 }0 n0 d- Y4 m& Z8 ~% |" {
createdump
7 S/ m/ P1 q4 x' d9 y4 a0 p# U$ U- Y9 \( V8 w5 ]9 P2 ~
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法% @3 n& X- K9 }6 g5 C/ Z
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
- h9 J$ T3 x& z  J- i这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
$ T* E( ]. }3 S8 ^0 W3 y; s开始使用:
# g8 s( ^  s8 [' P( i
        ' }( {2 W& _. j8 v
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    . {+ t$ o7 v3 i+ l$ C% |3 e2 n

" ]$ Z- k$ K! E# |/ w
       
    0 M9 G$ p1 a, ?0 W1 c5 Q7 y" m4 U
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    + {9 Q, l+ _4 L% W) l% ~6 l
  • 如果报权限相关错误,可以在你的yaml文件里加上:7 F/ l1 I! D2 S) i/ Y
4 s1 ]: n8 N* b, ?/ j& c+ f( m

# K" }- O3 ?5 f$ g分析coredump文件
6 w4 F! h, w% Z; F
, a$ G; A1 `$ @+ c( x( _先将上面生成在tmp下的coredump文件copy到可以调试的地方+ v4 |# p6 I; q  y; I
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s$ y$ p. g' n+ ~; N% q( I2 H: I! L
6 y- t% J9 [0 O. h1 \
然后为我们的coredump.1文件下载关联的symbol:
. N! [4 n7 Z( K如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
6 Y* l- L. I7 O/ P" X/ }2 E$ i8 G' N* [0 U/ j& }  m& I
        ; o7 M/ d; B: J( H* {* _8 f
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm   
    . P9 O; Z6 k& `( I% n! i7 ^6 X9 M* d
  • sudo yum install dotnet-sdk-3.1
    & i0 `5 G- x4 a* T( G  |
如果dotnet-symbol没有安装的话,安装一个) x- u6 I2 `& B8 I
0 A" P& M0 ~, C! C0 E+ k5 l
       
    4 Z7 @/ _3 z% N0 Y- }; Y
  • dotnet tool install --global dotnet-symbol    % [  Z- E6 D, Z5 N  }
  • 然后关闭当前终端,再打开一个新的. O% s& B# l; e* I. H- ?
然后执行dotnet-symbol --host-only --debugging coredump.1
8 ~, q: G, E& C) O0 W- s" x$ m7 g
; N6 j: r/ c/ \

& K% b) ?+ g, q- c6 f2 v! D
        5 E" V, K6 P/ S0 B/ q' G
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样0 V; B7 ~1 [( O) N1 ?

4 ?9 w8 _% t0 [然后我们使用lldb进行调试
6 ]3 H9 }* `/ _2 X$ a, J  t& K# o) i- D1 a5 l
       
    ( q( J/ k9 D7 ?! J* C# r5 u
  • 如果你机器里没装的话,先装一个吧    ; N' _/ C  b1 R1 J; x
  • 安装sos插件:
    6 G; \  h/ w/ @
              * h; H9 i4 m! d( {; t6 t- [( S
    • dotnet tool install --global dotnet-sos        5 g9 S) U, G: j  L' ]6 A$ s
    • dotnet-sos install    ! R$ ^3 \+ l8 z+ ?
            
    , B& T0 t/ ]* K  m" Z1 u6 R
  • lldb-8 --core coredump.1    ! a$ k. B, c" V, Y
  • 然后就可以用lldb来分析dump文件了
    2 C# m( `( k/ a% J" \7 |& p1 q
5 e* w9 k4 v8 H* Y' U+ I5 v3 V& a
相关资料:
# P+ K+ L, F) O0 b$ {
6 N7 r* B( x8 E8 v+ T0 B
        ; h* ]" `1 K. P! |: ^
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    ; `" g9 W5 H7 V& x1 s, l! ~
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    ' g( ]5 t6 H& j# `: w+ M- u
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    7 ?, U! N- ^& h
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    * l: Z0 s: g; o1 C7 f. T( N
  • https://github.com/dotnet/runtime/issues/11012   
    ; `/ K% t/ e' @# u. M
  • 关于大对象使用的注意点以及官方blob gc的实现描述
    5 t6 A+ p, y" a7 v  R; J0 R& @
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!% y2 F! s1 {$ }* ~# k

1 [: y# b3 _: `' C, E来源:http://www.jb51.net/article/232931.htm  y' ^9 q) ~6 L, z7 K0 d/ f
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-12 04:27 , Processed in 0.041191 second(s), 23 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

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