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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6659|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录
& N* r' h+ ?  A+ l( H* V7 d" T5 e  k- {! g2 F" Y

    8 W, c! g' a0 ?* [: l/ m
  • 安装  ~# |& `) ]& f' Q. H) k
  • 验证! u6 `8 ^2 [+ `
  • dotnet-dump; A% N6 \5 j2 V2 v9 h0 |
  • createdump9 V8 Y/ n  @3 [: h# t3 _% I( `
  • 分析coredump文件, z% l; ^/ V4 j
  • 相关资料:
    2 J* ?3 U/ J# _) O6 X4 e

: S& x! C4 A/ B! U+ Y' N" S5 U安装
1 j% z5 U/ G  M+ A1 o: `$ N/ H
0 e. _2 z3 L$ W; D
        . n0 t' a& s5 U% |( W! i1 |) q
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像    : `' j) T* n# x! d
  • 准备Dockerfile$ I$ j4 y+ a# a* n* G  q8 ^
  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
复制代码
验证. p3 ~( M& D0 a  h* ^+ {

" o: \' g, p/ p- {3 S+ U基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
2 }  c, O" K- j+ n, i% w0 R1 R+ w用我们刚才制作的基础镜像随便起个demo程序验证下0 J) A8 p( D% H
        % |* D& s4 _2 f& \1 d' L0 ^7 B
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    : r/ f  P. t% @; b- |

4 o* f5 O8 P& d2 ^; T$ ]
  v$ A9 w  b4 Z& d' G3 L
       
    ( g1 A! e( Y& n$ T( j' @# w5 H% m
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    2 G) y! P# G" y9 j

1 n0 E3 c4 i: d至此包含tools的runtime基础镜像制作完毕。/ @, N  `0 R. ^( U" j+ f! S) j& a

; a2 G$ h7 r! O/ _dotnet-dump
2 Y- Z5 t6 V. F" j7 x/ \* S3 E2 t6 ]. x5 e( F+ s: c4 ]
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
2 ?' v- u) `& T. p6 e8 Z
$ p6 L7 n8 _4 A' }createdump+ a8 b  e1 }5 H( M) D
: ?/ m9 @/ L% ?1 g8 q, o' {
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
) `( b2 F) U" i$ u虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
$ D. n+ [: v( V" H; w这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下$ d% P3 z* _0 {9 i# j; s8 P/ X
开始使用:
- @3 y( w/ s( L9 E
        8 @* e+ U! v( h. _
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    - {9 h" \- T5 U! a; k
( w- j) c/ [/ @4 q# ]3 H& j
        8 ?; @! g6 x9 z+ G' ]0 A. r  }
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    ! R6 d- J5 D& g/ H
  • 如果报权限相关错误,可以在你的yaml文件里加上:( g) s$ W+ F, E9 Q
" W7 g) x+ t# A! j& z

5 {" l- }, |8 A: y" {( A分析coredump文件5 i8 }2 \. y! Y, h: g, Z5 E
' K( Z( R9 h. n
先将上面生成在tmp下的coredump文件copy到可以调试的地方, F/ i0 ?( n% ]2 y4 X3 g: ^
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s  u0 W. T+ }7 z3 u
7 j: f2 f3 G, F0 O* m
然后为我们的coredump.1文件下载关联的symbol:' e: ]" C8 `1 T2 o# q2 M- ]+ B
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
: B& U. o5 j$ O1 M, N. |0 u8 a, G0 [. I" @2 [( `5 b
          j8 I* ?8 i( K/ [
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm   
    1 t/ Q5 o6 M4 n- {+ y3 v+ {
  • sudo yum install dotnet-sdk-3.14 x) D* m" j& y& |9 i
如果dotnet-symbol没有安装的话,安装一个
% Q, H& z0 h+ j" X. H5 D$ c" {% B- M6 N8 O8 W
       
    2 D5 m2 H9 d: a' X7 X( O8 b
  • dotnet tool install --global dotnet-symbol   
    8 L" W, q: A9 V0 @2 {2 K3 r# y
  • 然后关闭当前终端,再打开一个新的
      _) X6 v1 y( a- s, j/ B" G4 a! Z+ j0 w5 S
然后执行dotnet-symbol --host-only --debugging coredump.1# H5 p/ ]0 I6 W5 @; g
3 B! l2 z* B! P. \$ s3 D0 N

) w7 l# _6 x  x/ q. i# b
       
      ]/ L# K& k5 N, V% C- |
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
    ! y4 B5 w- M& t" Q& T
3 J$ k# L. l' _- S& v
然后我们使用lldb进行调试+ P, ~; c8 p* A# Y7 N7 U

) J; V1 |; A! \+ m
        7 I: s; ]+ ]* q
  • 如果你机器里没装的话,先装一个吧   
    2 ?7 s. G. V# V  _7 d) k; [
  • 安装sos插件:5 j9 Y% W& C$ F+ |) X! k
              0 u: _% _+ O  B2 t* G( J" R
    • dotnet tool install --global dotnet-sos        
      9 O& K& @. W& U2 W
    • dotnet-sos install    , ^! P* I/ r& F7 s# y- O7 o
            
    ; ?; f6 {/ O/ n
  • lldb-8 --core coredump.1   
    3 V: z4 ?! a! ]! F. w) L) o4 [
  • 然后就可以用lldb来分析dump文件了9 y: p/ p" F3 M& S- `2 d
7 B1 j. W  L8 E; M
相关资料:
. `" {2 e* b, _; @6 S
0 B& _7 e. H+ K5 L6 i
        " C0 R! r- H: Q: A) a+ m" }
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    5 Q$ p; S" N# K8 R0 I
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    1 |* |5 v- E- x4 O& l: p, c
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    7 L9 U% e- E* g2 n5 ~
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    2 i) M. E' K* T0 @
  • https://github.com/dotnet/runtime/issues/11012    / I5 R1 w$ Y: k7 u+ E3 |
  • 关于大对象使用的注意点以及官方blob gc的实现描述2 e- ~6 i1 I" l( I, {) S
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
+ @( U; a* ]! r. h/ d7 H3 r4 _/ {$ L) R
来源:http://www.jb51.net/article/232931.htm
0 H1 \# [6 e8 E免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-19 21:36 , Processed in 0.043839 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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