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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6605|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录* w/ q' o3 s4 V3 v6 S

7 F, t. H9 w2 U5 A; Z
    ( u) {) ~5 P% R  \  g
  • 安装9 K6 V4 `( E- c! m5 {# z" q8 `  C
  • 验证
    % K2 e3 V1 k& E
  • dotnet-dump
    . R3 {  C! p0 x4 `1 J
  • createdump
    ' x& h/ \& p  K3 q# u# \
  • 分析coredump文件
    ; H$ M& u" Q) m/ ?! A' r
  • 相关资料:7 G: y" e% j6 V- ]% L' C
$ ?) H8 ]3 O; h* R* ~6 E; e" g. N
安装7 c+ r! @2 Q  i
* H8 I' I' k( {9 M5 \# N% y$ \
        * ?+ \+ k# e& X% W
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像    6 }, e4 z  O9 X% p# A
  • 准备Dockerfile6 a; s4 {7 y9 @# E* @* q
  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 g: }$ P# d, H6 R

1 Z+ i! Y& q, b; y) r3 N7 W5 T* @& L基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
: B: S$ W( b/ W" ~9 h6 i用我们刚才制作的基础镜像随便起个demo程序验证下/ i. ]6 u; G7 {7 [
        ) g6 c8 o9 g& b/ N. O
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    1 ]7 @* P, C0 I* x# o" G* _
8 d  C' L5 G: G; D

$ ^* F2 o) B* ]5 M
       
    % X% ]0 s* s; H9 o
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    9 f& U- r* a* u% U- y3 n2 ~

' b, ^- N. R0 s2 Q至此包含tools的runtime基础镜像制作完毕。
2 N" s* z2 x  q5 a1 m  u( \0 I3 u# v
* ?2 ?+ d7 d( x5 I3 Udotnet-dump/ M& Q6 u  I. Q' |# J

4 F3 v6 V# q) {! N1 V' s它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
# S$ s) i! z+ b+ a+ z
  y2 M9 \8 ?. ~! _; Ucreatedump
4 ^# M4 {' ^" v  L  w' ?0 y' {- P# r
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法# [+ `& i4 H3 W9 c# }: o
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
& f, z6 d$ q+ E这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下  l. v  w8 F5 @
开始使用:+ `  {4 }' F6 J6 p: }1 L3 N2 W  j
        : T( X2 Y8 \9 R7 l" K
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)* ^) m1 m: p' Y7 Y8 I

8 Z4 j! J! D  Z( d* \
        5 \: ~+ T; O  L1 X/ C
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    $ T# J) y6 U2 D* M) t7 q- C
  • 如果报权限相关错误,可以在你的yaml文件里加上:* B! w, j. b; p+ k# e

# B) W& |; @$ R* z& S1 r$ E
! Z2 t% M2 e9 Z3 O$ t7 Y3 z分析coredump文件$ N3 v5 E# @2 t+ K

: W5 c) v9 J' A: x/ w2 L5 }先将上面生成在tmp下的coredump文件copy到可以调试的地方' p+ l. u2 K4 [' ]3 W! o
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
! w  r+ j7 X5 a* Z2 {
2 d5 x6 X% R  w* ?0 }
然后为我们的coredump.1文件下载关联的symbol:
, \) e& x7 ]  |3 N+ N如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
' W* [* M- l; i2 ]% X, @$ ]& L6 Q) N! }
       
    4 u% U& m0 v) e! E1 s2 I
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm   
    7 c" l# {( T# U' p% ^+ [
  • sudo yum install dotnet-sdk-3.1" a2 i( |' o4 v7 }; c% |" U
如果dotnet-symbol没有安装的话,安装一个
& e( ]$ X3 v1 T& A  Y0 A
4 L; o) c) U9 m$ H' G5 k4 m# Z0 {
        7 l% w. f( I0 V7 U) A
  • dotnet tool install --global dotnet-symbol    $ l5 `5 {+ T5 a! W0 l( l
  • 然后关闭当前终端,再打开一个新的! Z' d* Z* I; I: A7 l
然后执行dotnet-symbol --host-only --debugging coredump.1; ?) m- h5 H4 z- j7 `7 Z
% z" k- ]9 b: x# V3 n

/ R: A5 v- }. Q9 b  u! s# C" f
       
    / X! {' y3 V9 B
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样( Q1 E+ @, P7 Y7 D
7 P7 J! V0 A) \4 a/ V( t) b
然后我们使用lldb进行调试
; |% o; x/ r" j
8 g4 R* U* T( N/ q$ j5 D: r
       
    / ^  @- ]4 B% z. ?, p! c
  • 如果你机器里没装的话,先装一个吧   
    5 d+ f1 R! J1 i& D( d: v
  • 安装sos插件:
    9 y: v+ Y* e+ d3 U) Y0 `6 s1 T9 y
              
      ) m2 G$ q5 ?- c. J( K  u
    • dotnet tool install --global dotnet-sos        ( T" U( X& l  F3 n0 K! h
    • dotnet-sos install   
      $ O. C3 T4 t, o1 r' u
            3 V9 B* `3 Z6 A+ ^9 r
  • lldb-8 --core coredump.1   
    5 O  r7 H0 d8 A7 I$ U& E) i/ C1 N
  • 然后就可以用lldb来分析dump文件了
    $ D' ~, F! [+ |6 D$ ~" K8 p

% l# w! u% U! g  m' z0 ?* D相关资料:$ D8 ?3 u. G) x& L6 q1 [
- G3 b" \  ^3 i4 a. V  U- F2 I& S
       
    3 L% f' D& f! \/ Z+ v
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    ( F$ \+ E) V; w% q% P; g1 [  \
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    ) p" `" q3 f8 s& w
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    + n7 Y- f2 \! c5 e# J
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    9 j: m9 B9 e. K9 _( `6 s
  • https://github.com/dotnet/runtime/issues/11012   
    # Z2 H2 ?0 |/ y
  • 关于大对象使用的注意点以及官方blob gc的实现描述, a3 t( X1 u; }% O7 a& P
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
: ]9 _3 j; C3 \* p7 M; ~# m
/ Q7 K) L4 V. E来源:http://www.jb51.net/article/232931.htm; o- s/ T( v! g
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-28 04:50 , Processed in 0.036427 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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