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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6658|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录; `6 w. Y  p$ W% [5 R8 T
) x' B: G1 j7 {) R6 K/ L) x

    2 M. X% I5 Y0 C
  • 安装
    & w- ^1 ^5 A, Q$ d1 q% i7 J. U
  • 验证
    7 t6 L( j! p! y' p: V% \. \8 ~
  • dotnet-dump3 D$ D% o2 C8 A3 L% A
  • createdump
    % Y8 v3 w8 |  a
  • 分析coredump文件
    0 J6 b! f6 a. ?; Q' W8 N
  • 相关资料:
    * o! S  p* Z2 C1 ^2 K' o
! K) u, y8 Q8 l- |/ w
安装& R0 D% i% w% q1 R( {+ S3 H! \" k6 u6 T
8 Z4 n# o3 x* l! F: F! V
       
    & O0 n. G2 P% R$ w9 R
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    . r  ^* E( }% e' Z5 y' i2 p
  • 准备Dockerfile
    * N* ~5 L' r8 D0 O9 X
  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
复制代码
验证
4 I; V% I! ~7 L* F  ?  L6 i1 M
; W+ \6 {# T7 y) H; r& Y基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
6 J- y1 Q& B0 R. x. x# M用我们刚才制作的基础镜像随便起个demo程序验证下8 V  c4 U  }) w/ C
        ; m5 [! F5 f' _" B/ m; h1 z5 Q
  • 已经包含了tools文件夹了,里面存放了我们的tools工具1 v8 A& _) M) k2 R+ F

- }5 R! v* w  E, H5 u

' ?1 Y7 q1 o# }& T. K, A
       
    6 y: d* m+ K' d4 \' p* l) u
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    : k" d! e( ^! b; e* i( p* G! V
3 p7 E- U! u" f& M
至此包含tools的runtime基础镜像制作完毕。1 v/ d# e$ N6 x" S' c* `3 G6 n4 Z

) x/ x$ N3 ~$ C( ]. Ydotnet-dump
" |3 o& C& |! V) P6 B. \% T& C" z' J9 f) B6 q/ S5 I
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
- O' j4 I. B& d4 f: X
: s; s/ s# [  X" E) H0 e: gcreatedump0 j& g8 B3 p  i$ K1 T
' ^, F  j7 d9 i0 g: @: b
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
6 G& ^6 Q/ ^# N: n' L  _虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误; o, {) T- C8 F: D, i
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
* c; U( k- m, J! x开始使用:
( ~& T6 U1 G1 F, s; h& r1 A
       
    $ O, V- y# h" t
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
      Y- z9 ^: Q1 t; ~. _

" O& h" }% G( w" i
       
    ; p7 M' d) Q* h  t) A7 B
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    7 g) T' n3 }* e* B
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    ; K( W& f! X  ^

3 C% }' b, J' L6 T
/ r5 c6 A& A: h3 b, z" l分析coredump文件* z6 B$ b3 R- C9 E" \

2 f6 S4 N7 K" Z! M先将上面生成在tmp下的coredump文件copy到可以调试的地方+ ]) {$ E8 T7 ]+ m
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
% m: x1 W5 X/ `4 }) }

7 J- y5 j1 i0 I+ l: S" R, ]' e然后为我们的coredump.1文件下载关联的symbol:
* ?% {; ?% E; j6 e4 {7 @3 C如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
+ ^7 k. o+ S; {$ V8 f& m0 G. ^
9 |, i) }2 o3 G+ Z" {
        & o$ B+ j  O% f6 J
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    # ?! y+ ?8 W# I1 \% n; m* R* v
  • sudo yum install dotnet-sdk-3.1+ u2 t& \$ Z4 p) @7 ?) L
如果dotnet-symbol没有安装的话,安装一个
$ A$ N1 w, s. T4 k( ?/ Q. k# l8 G0 m1 ~( e2 N
       
    ) g$ l  O) Z# F) S
  • dotnet tool install --global dotnet-symbol   
    - @# W3 ?; ]/ a  [8 q, V! {
  • 然后关闭当前终端,再打开一个新的
    ( i) H+ d( ]+ ?$ Z: d! S9 r9 v
然后执行dotnet-symbol --host-only --debugging coredump.1# ^$ ^9 d1 l7 K: n

/ i$ O- T+ k$ W

! _! p' d" p3 Q! G$ r
        ! J' f# {6 S+ h: {* |
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
    5 x, G* [  }0 u3 B

- Z3 J- |# [: N/ h( r- O然后我们使用lldb进行调试
/ q0 n6 p1 L) ], ^1 i  T; D
& ~9 E- h& y7 F& C. B
       
    # z8 k- `( u' A( U
  • 如果你机器里没装的话,先装一个吧   
    9 c# P+ _" _( A' @
  • 安装sos插件:
    : R: }$ b. A3 Q% F: k
              
      5 e" a7 A; Y8 S  i9 g* J8 h
    • dotnet tool install --global dotnet-sos        7 O( \& Q3 u/ e7 R  {( R, S7 Y
    • dotnet-sos install    + d# m  b, u% U: _' a7 b
            
    . O- G3 K; e; N7 z
  • lldb-8 --core coredump.1   
      p3 a7 x. v5 q' y0 a$ f& d
  • 然后就可以用lldb来分析dump文件了
    8 s% G$ V3 S8 h9 e, W
# {* f9 `$ R; b7 x& z; t* @) z4 H# ]
相关资料:
( k  M+ o1 K: a. v* e/ Y# f
% A' E: Y9 r7 J' Q) ~( a
        0 V! F2 d. A; n0 E4 [
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol      `, B8 {2 a" c& m
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    8 q, U2 p: u! ?, `
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    9 [4 u' F# W" ^' Y2 o
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    , w, h8 [: F8 X9 S, O
  • https://github.com/dotnet/runtime/issues/11012   
    - B$ u/ P0 a, ^" {
  • 关于大对象使用的注意点以及官方blob gc的实现描述) {6 g% a  o4 L/ q  e: {
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
6 r# i$ j, W3 S# U
+ i) Y0 K: b$ d  _  D, W来源:http://www.jb51.net/article/232931.htm
) ~2 L: {: @  _$ ^' y4 @& y, p/ F免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

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

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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