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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6558|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录
0 y$ q, o7 S8 d' c; y# l  H) r$ }& n! q3 a

    & \; C, C1 E: |5 G
  • 安装
    - ^, t4 M4 \9 t$ M4 ~
  • 验证' w: ]$ b8 B+ Y4 a: F
  • dotnet-dump
    % _# i* ]2 ?6 V, S) c
  • createdump! H; s: n  h( D0 L" G' Y& R- Z
  • 分析coredump文件+ _) X. `6 i8 k% \& O" w: m; w% V
  • 相关资料:
    ; u+ F! w/ q6 \) k. `* }

; W2 d& b+ B/ k2 F( m) v# O, e安装
2 I7 z; Z. M/ ]$ R- ]9 ]8 w& n$ N2 a
+ a7 O" u" C5 @: L
        # B  t& ~' e1 o
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    / O5 A7 X; z9 e
  • 准备Dockerfile
    4 p3 M% J4 @* y$ e
  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
复制代码
验证
) Z+ f$ T( q5 n' }' G4 `& y, k  {
  f6 b! V$ O  I6 z4 Z基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多2 ~9 H+ w6 O$ H/ v% n
用我们刚才制作的基础镜像随便起个demo程序验证下8 w3 n& H7 Y0 {
          C, T8 o6 ~& m# L+ e
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    / n0 o. B, x- _: J" E3 k& Z1 ^
3 R. ]+ g0 @! u& W4 j% \6 [

; Z; ]+ V0 ~& @- `% \, d0 f4 O/ H% F
       
    0 S" a0 f$ }2 c( I
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    : |4 S4 c8 }( r* v0 Q  s

, w& F. a6 f4 Q, I2 m8 c$ q至此包含tools的runtime基础镜像制作完毕。
  o% Y; T. t; F3 m! t+ p/ j8 j+ {& l# Q" D
dotnet-dump+ L% d4 z( b  ?4 x9 ]' ?
( h+ ~  Z% ?0 m% F* [2 T3 b
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致+ `  X. n- E& W+ C  F

$ Z) V! k( u. x. i  S. Vcreatedump
8 x# e: X5 y( G8 G+ N8 I
! m0 b1 b0 f( ]; K2 P它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
% J- r- Q  w: L$ ^+ j虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
  Y& B0 V; P/ J. _6 p, X- w  {这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
! S9 G& f: A& z# v开始使用:
8 j- v/ L& G+ Q" |( H0 f/ v
       
    . i/ H" g8 s4 p8 f& W
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)" N( m7 ?# B& ]' a/ R

% G& C7 I! o; [/ ^/ l" B
       
    3 L) W4 a  g; D, Q- H' z) ^  |
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功   
    2 t$ E: u2 K5 {! f1 G+ v- O! X
  • 如果报权限相关错误,可以在你的yaml文件里加上:6 X) m6 n+ ^+ K; [
' a7 L' C- K$ C5 s

9 ~: b+ c9 x7 r2 }/ e6 s% H9 V分析coredump文件
2 C1 Y. Z! [7 S) Z( ~" ~/ d# J) }$ u
先将上面生成在tmp下的coredump文件copy到可以调试的地方
' H, p) ?7 {2 S: dkubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s& Q0 M" H0 _$ a+ L5 \

6 @5 f' r/ k5 U& Y  H" n+ c; ~然后为我们的coredump.1文件下载关联的symbol:9 |* B7 Z8 i+ I! h, ]: M2 d/ g
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
  t3 k5 n3 |) }8 z1 f5 N# n/ B9 b  R( t: H
       
    8 @$ B: u. v# b9 x! f- A1 V+ L3 q
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    . R8 Y! a4 I" e0 \3 u+ {
  • sudo yum install dotnet-sdk-3.1
    5 W6 \9 ^. A) |
如果dotnet-symbol没有安装的话,安装一个" S0 F% h- s( c# }" c
( u) }, _4 b  O2 v
        5 S# J# K. N/ R+ c& E
  • dotnet tool install --global dotnet-symbol   
    & X* I4 f2 `" a% v7 }( C5 u: o
  • 然后关闭当前终端,再打开一个新的% r* t, d. h. S
然后执行dotnet-symbol --host-only --debugging coredump.10 ?  I: ]" A- o3 }

. M8 T0 @6 E' j) ~2 ~

% D8 g% u( Y8 W7 i- [* p8 h) O! n
       
    8 Q7 U! I1 J5 ^7 }$ ~/ `0 |& O
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样3 U+ E1 W$ K( Z* H6 b
' h9 }2 D: Z8 {6 [$ F: g; l& d5 m
然后我们使用lldb进行调试
# r# ^: u7 ?: H. I4 G- j$ y& a$ |
        3 a6 F1 u6 B; D
  • 如果你机器里没装的话,先装一个吧    1 u" A' H# R6 O+ }; [  e
  • 安装sos插件:. ?0 ~, g" P% O* S! w
              
      . q/ R4 C$ E: ]9 Y! }) B
    • dotnet tool install --global dotnet-sos        
      8 F) S' `1 P7 w) y$ ?; X
    • dotnet-sos install    - S9 S/ s+ t5 O* o/ ^2 |8 h8 K1 W
            
    % }. l; v- y' y  c9 q
  • lldb-8 --core coredump.1    8 E* c! M8 E- w' Y, \0 k/ z, S
  • 然后就可以用lldb来分析dump文件了3 t0 @  C( V1 Q  m
7 |8 U6 ]6 `% U; u/ O/ `0 K
相关资料:6 y  @  l. Q: C

/ `+ f6 W: n9 U2 v! W  M  g
        : a: N0 y! I2 ^0 ^
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    7 e  {5 }' Y/ q. l& n
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    8 @+ w* V1 ~# i- N( ]* s, n6 H
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    % R, o! d2 Z+ ~* y- O4 |
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md    % s" M+ |- j$ Q+ I4 d8 Y& n! Z
  • https://github.com/dotnet/runtime/issues/11012    5 ?) B5 U6 L7 R$ H) H' ~
  • 关于大对象使用的注意点以及官方blob gc的实现描述
    " A( P; Q) }1 k
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
9 G" A1 b2 O6 w5 z- ?
: y* i) g$ n" L' E5 w& `" P来源:http://www.jb51.net/article/232931.htm9 ~" W" F" \7 L% v* i# o
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-12 06:43 , Processed in 0.040442 second(s), 23 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

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