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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6670|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录
6 F) T, F- a* }' M$ Y- c# T- i
( _; X% O- h9 l& `, K& O! K
    3 L0 I% |. M- X; p" m
  • 安装1 T4 c: |! [) @7 l  A
  • 验证1 M' i4 d$ y4 `+ v4 i0 U
  • dotnet-dump
    9 i8 J5 N2 E; V0 O7 A
  • createdump
    6 F8 W! _' I5 c6 G. G4 n+ m
  • 分析coredump文件
    ; @3 I; @( `8 P
  • 相关资料:" B6 ?/ R# ~* o" q. C7 @
% z) V: N$ J5 z- D
安装
) B* `; L7 d4 w4 P) V, R) }0 h( {1 \. V7 s
       
    ( G5 _6 ]4 @8 J7 m
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像    ; w3 Z, M' K* F. a9 r
  • 准备Dockerfile
    7 x7 u9 u6 [/ N6 F9 R# ]* K+ A
  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
复制代码
验证
$ G8 n8 @* F! _% i- Q) L  v$ p1 A! a+ j& N( u3 @
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
0 O; m! `4 [. C用我们刚才制作的基础镜像随便起个demo程序验证下7 f6 b2 m5 m7 F3 @6 a
        . ^2 b7 J$ e! G8 f1 H1 M* T* e
  • 已经包含了tools文件夹了,里面存放了我们的tools工具" y1 n% A7 M  j( M* k" S0 e+ v
6 Z) f; _7 i0 I

. l  \( s6 |. E6 f
        ; t: g( T* V4 Y& q
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    - ~9 Q( ^9 ~1 m3 S" P& x: ?

7 S5 Y6 }5 B1 }/ e+ z. C) H至此包含tools的runtime基础镜像制作完毕。
# N6 D, z. v+ C' n' i
) Y! v% M3 h: G9 k/ [6 ?# i7 vdotnet-dump
# E( r: O" n: c+ P, y( e7 r3 m
" m" f% o/ n' |; f; a! E$ Z) ^它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致" R# @- {3 w0 }$ g4 g5 W

& \3 b; ~5 O; ]% S& Q; n( T3 Ucreatedump
4 f. Z; q" R* k! N8 O! K8 O# l8 ]; @0 e* w
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法$ @$ {2 m7 q4 Y3 c5 Z
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误# f: e0 j2 K( K
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下/ N& b8 k5 s  f/ @) w9 l
开始使用:& }0 l  B9 w! E* {- U, c6 m
       
    " V2 m7 r" v5 B& c1 m0 B2 b% [( E
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
    - @  ]* |( H( |4 G, R4 Q6 I0 V

9 Z' ~% R) {! Z1 U+ g! i
        % @3 t3 g6 |* }4 r  z5 n
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    ! [5 H$ V' |+ n3 c; w9 V
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    9 p  a% W. l2 D% {
7 Q) }, \# q- y# m/ N
! q  S/ G9 T7 |# \" J
分析coredump文件
6 }  e) p' {8 u1 C% n
. a; T; |2 A4 ^2 a0 U) s2 K. j- q先将上面生成在tmp下的coredump文件copy到可以调试的地方
6 z9 e. l3 s9 C- X$ z6 Ykubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
* t4 N" j% n5 s

* m  Q0 w; b6 w, {然后为我们的coredump.1文件下载关联的symbol:
6 Q" l0 c' s0 O2 r: _# X0 L% H如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
  j9 f" K6 F0 V' s* v6 N
0 y: J5 D/ W" y+ o  {
       
    * M$ _7 V! Y- ^3 l( |. H
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm   
    ( G* y. q( j+ w; N" ^' v
  • sudo yum install dotnet-sdk-3.1$ P) n) M' Z6 R+ k) I) y( }
如果dotnet-symbol没有安装的话,安装一个
# c1 O! ?  C# y- p0 p' h  h' A3 F" K( r. g
       
    4 x6 E# p- b8 _1 r9 K8 R: Q1 B7 o# c) [
  • dotnet tool install --global dotnet-symbol   
    : D7 l) r* l! r0 U$ `
  • 然后关闭当前终端,再打开一个新的& U" [" ]7 U( d
然后执行dotnet-symbol --host-only --debugging coredump.1
3 }1 C' ~3 E9 @' y' }' ~
4 o, N$ ]0 w- ^+ [8 E0 u' B' t
( t% Z8 w# k( i% g: ~1 X9 ?: g* v4 G( I
       
    % H: }4 l; t! n6 b+ Y9 n
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样- `  V9 w0 w0 E- n- V
8 k8 H9 J: \5 c" y) g( ~' S: s0 B& d
然后我们使用lldb进行调试7 T' J( L7 v3 f. R- M: O7 {

  T$ s: Y$ h/ H
        ' ]& e4 P- j5 v
  • 如果你机器里没装的话,先装一个吧    6 ?! D% Z+ p& e* z/ b2 ]
  • 安装sos插件:. ?* F2 b  f  U. B% d3 T! N5 ?. a' }6 T
              
      , M" p: U3 c, L- {  l# d0 o0 E
    • dotnet tool install --global dotnet-sos        
      ' x5 k2 l# u: V# n
    • dotnet-sos install   
      $ A" b7 N6 J6 h% v
            
    - }0 \7 R. l9 l, ?' \
  • lldb-8 --core coredump.1   
    / t& k6 ^! p; {
  • 然后就可以用lldb来分析dump文件了9 C- F6 Z! S  L. X5 J0 _4 ^& u
* ~; h: F+ p! _5 c. I0 k, _
相关资料:$ c( v9 U/ C- H

# T" U- A$ w2 A7 w
        - T9 T8 p2 H* i/ s, ^& y/ U
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
    9 }; }" c) R; a( W' e8 [
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    ' V. b3 W0 a  j$ B
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    ' a3 z8 L. ~1 k0 n
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    ( q1 a: X: L, k
  • https://github.com/dotnet/runtime/issues/11012   
      y" z* l* l1 w' a& M! q/ C
  • 关于大对象使用的注意点以及官方blob gc的实现描述* k$ D- z- A- `6 d- e. ?" u
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!9 i5 {- }) e" @

6 ^% Y& {& U* ?7 R: Z来源:http://www.jb51.net/article/232931.htm# {, \* X8 L& h7 B- h3 h  S1 |
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-20 18:37 , Processed in 0.043558 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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