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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6633|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录, T3 `. F* g2 V- w* Q
; ?+ Z( v  c- d9 I- c' r
    + W+ {- c6 b1 R
  • 安装
      {+ a( B  ?% C% G
  • 验证2 l9 Q# l+ B$ F% H+ A4 D" D5 m- @
  • dotnet-dump3 x. l) j7 Q, e/ E
  • createdump2 Y) @+ l( ^5 @9 E. f" S
  • 分析coredump文件
    $ w: p' i+ o  r' O4 n6 r: Z
  • 相关资料:
    , N% a& w  H! i

4 ?* x7 h" ^% a4 d- g; O, n安装4 A7 G; r% G. [8 k7 P

" g/ q$ h; r1 O* ]- ~% {
       
    + R& |0 j8 l- o+ @/ C+ c! i3 L
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    8 d' x  O7 ?. z
  • 准备Dockerfile0 }3 l' p6 ~2 E- U5 Z9 ]
  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
复制代码
验证0 Z* }7 u. B& Z: m. m# H

; W2 U1 [. U% C6 I0 _基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多! J# A7 w4 ]  i7 c! V
用我们刚才制作的基础镜像随便起个demo程序验证下$ @0 O! z* i% Q" R8 |( V, D/ l
        , L/ t$ V8 Q1 r3 K- K9 p8 y
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    / i$ x( O2 J0 ]: C8 ~
, L/ S  ^6 {+ G& S0 _
( |0 S( ?9 `7 D% w: K" m" `4 V
        ) ^9 V2 z2 f% Z0 X
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    8 K& \; v: d" ?  U  R+ a; t

0 m5 l3 O6 s7 J! L3 v5 _至此包含tools的runtime基础镜像制作完毕。/ N4 w; k5 {- Y8 M) m' x& q( b
7 h/ F3 d4 q! M- E; a, A3 _& v* V6 @; ~
dotnet-dump
# q% a5 l2 Z- B1 H. `5 `. e/ Y
% Y5 D! E: t+ z/ }! d4 a4 ~它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致3 v  g" G9 S1 s0 B9 c* [; }5 \! |

! Q* N4 `, f9 A0 v& Icreatedump: O$ z9 }$ r% m9 Q5 c) Q- |
$ v4 M7 {; K. X, B' k
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法; ?" W( U0 }! y% o% [+ ?$ w! Y
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误# `3 L5 X% N1 ]' m% N; [) l* k" G
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
. Y5 Q; `! P- h0 |7 S开始使用:
) a) u0 r8 E) V
        ; p7 e6 a  ^: y. a7 ?4 O
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)7 K8 P* [4 @8 ?* ]( A( i& r
; r, @4 R' h7 W: J: E+ ^
        7 x5 g; B. R% t
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    - G' k2 p" F9 M% a
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    4 J/ D( o( `) k
+ p# V% \( X/ }+ m7 A" `

# j8 g1 Y. E( o# Z( }' ~# K3 `分析coredump文件- e" H0 t3 ?& X# U0 [

: W7 a$ A8 w  M( Z9 e6 d* r/ c先将上面生成在tmp下的coredump文件copy到可以调试的地方
& g6 r6 Q' D; D+ O3 F$ Hkubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
) O/ F. F. C/ @/ r- s! E! o
% y( q" U0 q. V2 p' k
然后为我们的coredump.1文件下载关联的symbol:
: F4 d+ b* n/ \% G7 R如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
7 t# j& f% P$ ^5 l1 Y! A( i! [
& A: T9 s# a  ^( x3 k" t) X. E+ Y) K2 k, k0 O
       
    # h: }" z( F& k' h5 B  J
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    & W9 I! w5 \$ _: k4 T
  • sudo yum install dotnet-sdk-3.1
    $ N. _. |% e7 B* c5 ]( L
如果dotnet-symbol没有安装的话,安装一个
' ?& \; i  d( x: P9 m3 m+ f1 o5 a1 f# l  B* ]- N. P6 f
       
    , K* T1 G, S; d" Q0 I. F1 }, V4 S
  • dotnet tool install --global dotnet-symbol    / y9 R" `# e) O4 R7 w
  • 然后关闭当前终端,再打开一个新的
    1 Z4 B: Y  W" y1 l% W8 f
然后执行dotnet-symbol --host-only --debugging coredump.16 x! y1 o- V' l6 l; K$ [- t
* C' a" b; `$ }1 Y' }. P

# ]1 i- g+ U8 B% G& X
        4 m( Q9 l0 c7 o! H. A0 I; Y( ]% ~! t
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样# S6 J( T& F, m  g4 Q7 h

! i/ v7 r) |" {" D* ?然后我们使用lldb进行调试( e; v+ p" E* t

3 H5 t1 H  `8 T. @+ R. [
       
    * M* W+ O% W' y4 j" j( [2 s
  • 如果你机器里没装的话,先装一个吧   
    0 H# R% c6 |; U$ h6 f$ L3 @" o
  • 安装sos插件:9 J( Q/ B& }! T" U
              0 U) T) R  a6 }( }8 \% B5 Z4 Q
    • dotnet tool install --global dotnet-sos        " e3 l! v$ R* a& x. K9 l
    • dotnet-sos install    . t) f. i1 d7 g; i6 H+ d
            
    ' F; u( j# w! @
  • lldb-8 --core coredump.1    . D7 s! D/ h! ^  f
  • 然后就可以用lldb来分析dump文件了
    7 V, e1 A5 u- W* @
) y4 T% b1 J# _
相关资料:
7 @% ]; ?4 E; ~0 t" c* R2 b0 y/ Z# F" j$ r
       
    $ A# m9 v5 c* o0 ^9 C$ l" w
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
    - L2 A- U- Z) o' Z* ?
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    ! m0 t' P" O) l
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    . }0 @: m+ q& N
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md    . F1 d" v3 f) o2 r
  • https://github.com/dotnet/runtime/issues/11012    # [: e8 t+ \) I" J+ Z  O/ j/ ?+ N
  • 关于大对象使用的注意点以及官方blob gc的实现描述% _. O0 a( L9 G0 C+ g: x, G
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!* Z) N4 Q7 z2 y3 b

4 y6 z! [8 N. ]; i  I. V: f来源:http://www.jb51.net/article/232931.htm
2 M% H+ ^, V& w. U; V/ G免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-23 21:04 , Processed in 0.041704 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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