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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6557|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录3 Z" j3 b; A" R1 b3 Z

- \6 ]. V6 A, l: c# h
    . M1 r8 k" m9 {1 I
  • 安装
    ) C6 d( g7 e3 i% [" |) D  W
  • 验证0 q# m5 D; {3 |4 i. b' B
  • dotnet-dump, E, N: d8 [/ I& l7 k! l
  • createdump, _. S6 V$ k; V1 V( w! U
  • 分析coredump文件
    5 T2 Y8 D2 Y+ `1 u& [' P: A
  • 相关资料:$ l' n: V# n! Y1 ~5 I8 l/ u

5 o& y" S- I, T$ E/ u5 G安装. A' C: \. L5 K/ p4 u/ F0 n& W
3 r/ F. ]0 b! ]: E5 _1 g" `* e
        8 }/ K9 J2 O! g/ T$ r9 x
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    9 b/ z& y' E# z1 o) S0 o
  • 准备Dockerfile- A* d3 E9 h6 Q0 h% e6 v
  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
复制代码
验证/ E( T$ L$ o0 K9 h, P- U4 m
4 R$ N6 ?. p# T" z2 {, x1 a+ o
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
, D* S& _; z) n2 c( N用我们刚才制作的基础镜像随便起个demo程序验证下5 D1 j. }1 h) S8 ~8 t' t* F$ w2 N, U
       
    $ ~; ?/ Z6 \% z( `* O
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    8 I1 u9 a, p; w; b( x
6 n7 l# P, k' d" Q

; Q( p5 h" n' K2 q5 }2 I+ \/ x
       
    ! \* T+ _. W) v8 C
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    ' ?) i' h& ]& y0 {! S( B; c, n) r
* V& }* m5 ?; p( q6 |
至此包含tools的runtime基础镜像制作完毕。
2 w6 f/ R) ^: K3 }% s0 t' U( ?: @) T9 [, P6 {
dotnet-dump3 A! l2 |' }; f" g- w1 ~4 I3 }+ N) Q. @
+ J( g" ]4 ^( w  s! u
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致7 E6 G% [. a3 L1 g
# H  F: F2 Q7 {% r$ a
createdump
' s. {0 \8 Q2 b; m4 p* D+ i9 j  @: V% X7 Y- ?: c# b0 p
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法4 l4 p) ~2 r* l% ~& p
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误0 E- w0 A" {( F) l
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下( x+ C5 c) `( R0 g, g7 `
开始使用:( N4 g5 L8 {( [0 ~$ J! y- P7 f" D
       
    4 V; ?& }/ h3 z
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)+ d, H6 ^3 g6 ~3 x+ K. F. K3 A

( I3 o* U( z9 H: p. W
       
    2 m0 o6 B* {/ u" a0 S4 D5 P
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    # k5 ^: N5 V9 I" b$ V  @0 r
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    / n6 O5 O9 d* a0 J; x

1 I2 ]" g+ I6 \* {, \4 r" i
4 {: X4 G& Y8 e+ N& s分析coredump文件+ x+ q) q/ f' B
! b; k. j& Q0 V9 a/ j
先将上面生成在tmp下的coredump文件copy到可以调试的地方
! U, M' @" f. h7 c2 ykubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
0 {/ j4 e0 n$ {) v, S" p8 T+ ^

$ J3 F' n4 L0 L! U" C然后为我们的coredump.1文件下载关联的symbol:
2 r5 g) B. v1 Q3 ?+ ~8 \如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
' |+ o7 G8 N& }* u0 g
2 r) T) x6 F4 ]' Y9 _5 D
       
    ' S1 ?; m. h' H0 L
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    ' l) x! L1 {: J( e# h
  • sudo yum install dotnet-sdk-3.1+ k* P( ]/ n! j1 c$ ?
如果dotnet-symbol没有安装的话,安装一个( Q) U9 R. D9 T3 K

5 k, W& h1 R2 H6 [4 M
        % |8 K3 T8 p* \: b% B, [
  • dotnet tool install --global dotnet-symbol   
    # b4 T- w: f; K' q
  • 然后关闭当前终端,再打开一个新的& F+ y9 `% P) R* T
然后执行dotnet-symbol --host-only --debugging coredump.1
3 z4 u9 l% c) {( F
8 H- ?7 Z9 Z! }
2 q3 \: E  B0 D
        8 k! L+ k# O; f6 |7 i9 o; F, o# ^
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
    . M1 D% X1 a$ R, k1 q, L7 O7 D: i' n2 n
' M- Q0 q5 {  u& @8 S  v. a( `
然后我们使用lldb进行调试
4 m- Z' e6 Q7 T1 O! w2 d7 P5 b; ^% K+ C) D# k( O
       
    2 \) Y) q, g$ ~5 ?
  • 如果你机器里没装的话,先装一个吧   
    : v5 D* J# ^3 [3 E! Z3 r
  • 安装sos插件:
    5 W- z5 {1 `' b' h9 ?/ ^+ _7 O+ v
              / S, v7 O; u# v' I: p
    • dotnet tool install --global dotnet-sos        
        J6 R( t/ G5 t/ N% `$ q) X( y5 p8 N
    • dotnet-sos install    5 K4 `# |2 A8 h& i$ t& r
            ) Y' X$ ^; O) a$ G
  • lldb-8 --core coredump.1   
    9 c$ e1 R" E% A
  • 然后就可以用lldb来分析dump文件了% C9 c! A2 J) g' |

% q9 W9 C7 K$ o, g9 j$ f6 V" v5 t相关资料:
& |- K% R/ G7 c" l/ J: ^
9 H( }, H( X+ h# n% V' i/ f, V1 F
        + Y2 D$ E# t+ |  N% _) [& P
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
    7 a1 B, V( ~" m
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    4 J5 S0 p! L9 i  C1 p' }
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    : t! J3 [4 s' r9 e" D+ m
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md    4 b$ i3 y7 }) @7 N9 [
  • https://github.com/dotnet/runtime/issues/11012   
    % ?' k. p5 l9 z& E9 c( ^
  • 关于大对象使用的注意点以及官方blob gc的实现描述3 d+ ^+ j6 j, [8 Q2 B: b
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
5 ]+ E. T8 N2 a5 f6 R. @7 d% B, S# V9 Y7 a( @+ B
来源:http://www.jb51.net/article/232931.htm$ k( Y: [  q* q! k
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-12 04:36 , Processed in 0.037276 second(s), 23 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

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