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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6635|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录( h9 V! D0 K- I
3 o7 X: K" L- T! V5 s7 A
    6 L8 o2 H/ O7 D% ?6 K; Q/ O
  • 安装
    ' o/ j7 x1 x4 T" }2 b
  • 验证# Z& u+ K+ F" X& N
  • dotnet-dump
    # w- ^( j2 Z; w' [
  • createdump
    ! N# X- h1 h* K! g
  • 分析coredump文件
    & D% N4 l+ P" Q  o4 s
  • 相关资料:
    . C6 N1 f* Y, p# z2 w: \* t
; F3 Q: b: G4 B4 \0 ?2 t- x
安装' u- e8 S7 h9 g

3 s+ r- b. u! ]. Y
        : q5 E: p3 h8 [6 i
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    : j2 _# Y  M; O" q) i
  • 准备Dockerfile) l4 \) ]9 L; t2 g
  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
复制代码
验证
' k# u$ [! H, R6 _1 \5 V3 ?0 e1 m2 k% L1 Z! A3 E, @3 W' L4 K/ g
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多6 {) [$ a$ }4 I& l
用我们刚才制作的基础镜像随便起个demo程序验证下8 x7 |1 D3 H2 |6 u- |' G; h
        . h# J0 m4 u/ e: s4 ]# G& Y
  • 已经包含了tools文件夹了,里面存放了我们的tools工具  ?: P/ D: r4 x1 e* k; O$ @5 r

4 V0 i# Q7 z" {5 e4 f8 n
9 U9 |6 r# u+ h3 e
       
    7 M3 L* e3 h- I, L) X
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)7 F6 S+ {+ `, b* G  H  Q) ~
  ^( M/ r( S  v- H5 Y. V6 t
至此包含tools的runtime基础镜像制作完毕。
& S1 D/ m) y4 p  P0 h' m) e+ ^" a4 V0 I- n
dotnet-dump# @. \6 F! o0 C  @1 h3 P" u

$ q5 x; F5 k, w% Z$ ~' @" p* T它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
! o3 h. c1 ?% M8 l& K# h2 d
( Q7 O# t, x4 Pcreatedump
, d& V: q; R- G: T  a* ]) J0 J& P
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
! t! s$ D/ e3 U* @. q' j, i# O虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
2 J5 C$ e+ M4 Y( B8 C7 R- x$ U这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
1 X5 g; q$ }4 N+ f开始使用:+ W, p& S5 K% {# p
       
    + e( N% G( f' u' h* E7 R
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    ! A6 ~2 S- }" Y, l3 G
, l4 L- X3 [: D2 d* O' b  U' g/ \3 h
        - \) a3 ^6 N5 F( j3 ~, ]
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    * T( u6 d( A) v2 d6 A
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    4 s! l/ @! {: O3 j) r9 V# W. Q! q

1 B! f" d& L/ g4 J& O& e
- P1 }4 b# U( F! W# u3 W6 p分析coredump文件( W0 r" E, u( `+ o$ C

5 z& H- L7 K7 M先将上面生成在tmp下的coredump文件copy到可以调试的地方
; Z; A* |) @; _% n# d5 V' \, f, tkubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
( r' l8 w3 C/ M/ R" [; M) \
  b- `6 j. q3 P0 f- h, {9 c3 r' t% Z7 E3 j
然后为我们的coredump.1文件下载关联的symbol:
7 f7 o+ D9 O6 V, g如果你准备分析dump的机器没有dotnet sdk的话,先装一个把) q5 Z2 h  R) }8 j. D' h( `

- Q5 Y/ O' s" ?4 T( F, M
       
    ( {0 v* W% V; s/ z
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    4 S. A( E" ^9 o, V
  • sudo yum install dotnet-sdk-3.1
    * q# r6 i4 @! V% h. Q* e5 ?
如果dotnet-symbol没有安装的话,安装一个
* y/ @' z% o( z3 `9 S( }* _
+ M0 H+ T& z% }4 \. q* w- o
       
    ( _$ ^, R2 y7 i
  • dotnet tool install --global dotnet-symbol   
    1 r/ K3 o; i) O5 J- b+ P
  • 然后关闭当前终端,再打开一个新的1 l1 @! M7 ^/ e: b. v/ |3 Q
然后执行dotnet-symbol --host-only --debugging coredump.1$ J% _( o. `. i

: ~3 S) p& }+ L$ q7 [& m
! |- Q, a: e/ i: a) N- j2 a; ]
       
      a* W7 M' ^) e4 S7 o# \; x# i+ ^
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
    3 J- I& t. ^( U* T; b/ O( Q
. _$ k! b' j' ~' L- Z
然后我们使用lldb进行调试. M1 o# N+ ~+ Y3 o, G4 V; N- r$ U

! A9 k6 J+ S, N1 F* e
        0 x( l8 k  E0 C* \9 a+ @9 h5 K
  • 如果你机器里没装的话,先装一个吧   
    ! R8 {) P4 M0 Y" G8 X* f1 @3 N' o
  • 安装sos插件:
    6 k6 U, b; }5 E6 `" |& ^
              6 ]5 a, `6 P* {, Q+ [- z9 L
    • dotnet tool install --global dotnet-sos        , d2 ~. L' U- L
    • dotnet-sos install   
      9 N( f0 M' n$ X! J
            1 g( f7 E6 m8 C8 h, f4 G
  • lldb-8 --core coredump.1   
    ! R& W% ^8 D; _% d6 L
  • 然后就可以用lldb来分析dump文件了
    % t; ^1 t+ H6 |' N8 \% O
  H* t8 L+ f- o3 ~7 s
相关资料:
& x. w% o8 S& G8 t7 B  O5 `+ P! ?
        1 Z# p2 _4 n& S0 k: H% X/ R+ l/ k
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    & T: Z* _8 N7 I8 k
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    : S6 }+ ]8 N2 g$ G0 w% K5 Y( i5 M
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    ' I! J' j3 [. B) f
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md    . C/ v0 v0 D- O( @) ^3 m2 x3 o
  • https://github.com/dotnet/runtime/issues/11012    7 @5 u1 N% U4 ^# T2 Q7 l% t  I0 @
  • 关于大对象使用的注意点以及官方blob gc的实现描述8 G8 A/ q. [, D0 l4 N3 X7 B; T; O
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!8 @; u. q3 z4 x/ |. W

3 t, {9 J. a( \7 G  s来源:http://www.jb51.net/article/232931.htm
" U1 |# Y+ j, r1 A7 }. H免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-23 22:27 , Processed in 0.041374 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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