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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6591|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录6 j& c2 o" b  s" R- ]$ q
4 Z5 M  b& }+ B: @  J  k, x6 u% W

    ; B6 w  O/ y1 a- r* W
  • 安装0 T9 @0 U& H, ?2 d1 j
  • 验证
    , q* a- h4 o" m" F6 I9 r# S
  • dotnet-dump1 K) x; ^* P" g6 T/ Y! V/ O5 r& c
  • createdump
    / S" |  c, E9 K
  • 分析coredump文件
    8 M, y5 ]7 F; y" y6 P
  • 相关资料:
    . ~/ x" |7 e' o7 k0 Y7 ?
; M, r& q' y: s1 _" {- }. B
安装9 [: W( m/ e* k. q
8 [/ s) @8 W4 M" W# [0 r' ?2 M
        6 B$ e6 `6 S' z
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    " s$ Z5 Z: T# j# q2 D! I. f
  • 准备Dockerfile
    0 m6 |1 [: S( D8 U$ B; H# o" X6 l
  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
复制代码
验证
0 l3 B& K" ^/ K( O) y) _  ?$ N" m+ [
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多; |# g1 M$ @: Z- \8 o7 O
用我们刚才制作的基础镜像随便起个demo程序验证下8 ]/ F- W+ ?5 l% E2 ]
        2 Q0 V* b/ ^9 ]2 f# k; ~
  • 已经包含了tools文件夹了,里面存放了我们的tools工具* n( U# ^* A3 ^# r5 B% G$ S/ \# R9 Z
& \+ M8 }2 U( p' g  {* C

/ [$ j8 e; O2 X
        ; I+ a5 |3 g: X, U9 V6 v$ H( Q
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式): z* x( s" z: f/ `' U% k( ]/ S
  T$ {' R, t4 `
至此包含tools的runtime基础镜像制作完毕。
8 p9 ~" j8 U- h" @; ^% i/ J) o5 m$ P0 `, K- r# f. q4 [) R
dotnet-dump
( v1 `4 G( L9 S: ]5 n3 q
% i$ T) u2 w* \它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
9 p( }+ K: D" x) U5 Q) {" \1 X% |1 {5 S; \9 E* }, c2 n+ P4 I
createdump# o2 m  K# j. e' i& L/ |
5 B# r/ `8 K# o# p" z# Y/ s* T
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法+ V9 `  g& `' A1 ]2 n5 P
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
& g0 q9 e& _/ R, D: \. P8 h这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下8 V5 o, S" Y! [8 A) K# v
开始使用:5 N7 z" R( _; N
       
    " M/ b! k8 N+ N7 @/ ~" {
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id), }0 R2 [8 v7 z, }1 |3 ^
/ O# \4 c) m* D  z
        6 S1 n9 n. r. c* \
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    ! Y+ u4 O2 A  e$ h
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    + F6 v( R% M+ L$ |
' S0 B- n7 R9 w$ i! S9 X

2 q! L. x% `0 L% U分析coredump文件
1 S* ^& o" f$ ?% ~: r2 j5 H4 o5 L' U# K& m4 j! b
先将上面生成在tmp下的coredump文件copy到可以调试的地方
, L6 e6 I6 F# x/ Z# Nkubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s: S  z& W1 W, z
. t% Q+ v" t9 G6 {" v7 h- v
然后为我们的coredump.1文件下载关联的symbol:2 X  v/ `; [" i/ Q
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
; m0 R7 R% s  L, D& Z$ f  @% h' x) O) z- h
       
    0 V- X. `; Q9 x7 A2 L
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm   
    ' X# e4 O; \- Q$ e( N* {& G
  • sudo yum install dotnet-sdk-3.1
    " ?: _- z& C# U: I* b
如果dotnet-symbol没有安装的话,安装一个5 z9 l7 k8 {  d! p# a( T1 D

* B; z* z( `1 z9 I4 `; }* ~) D5 v9 a
        ' d& U  ]  S* d: k5 q8 U
  • dotnet tool install --global dotnet-symbol    9 w) ~) r5 l! |" S# N6 q& E
  • 然后关闭当前终端,再打开一个新的0 V+ F3 [7 D6 U
然后执行dotnet-symbol --host-only --debugging coredump.1
% t; M  l4 Y  r6 L, P; Z, L- X$ o2 [/ Q$ a

6 X& ?( T% k0 e
        , A; z3 a; J' t' n2 F' r) C( X
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
    ( _( X& a; j! p! L* V. I  _; G" D

' e& R% ?. P0 i: {% B# M然后我们使用lldb进行调试
2 U- d* n* S% e7 `0 w% C
! o. H# x' u+ P- Q+ D+ L
        9 Y! c$ \& g# z' s: m5 X
  • 如果你机器里没装的话,先装一个吧   
    - R* c& }* X* H( k
  • 安装sos插件:0 r- x1 B/ U. u% X$ I, U
              4 l# U9 ]' }8 d
    • dotnet tool install --global dotnet-sos        ( U1 W# h  y! u- d
    • dotnet-sos install    ' `) ^9 ^5 R/ v; |
            8 K& o5 P$ {+ ?" N) K
  • lldb-8 --core coredump.1    1 H: s& P4 O3 g9 _' C2 ~" u% b
  • 然后就可以用lldb来分析dump文件了) \3 \0 {, t6 q* ]$ ^: x' D
; |3 n3 c; t/ i* g! I+ ^
相关资料:5 `! U. {; \. K4 d/ @! j
6 i5 Z1 i# w! T2 M7 m6 e3 O
       
    . @5 x9 {' ~: Z7 U4 b
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol    # v8 `. s) s$ S* ^  C
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md   
    % h7 J5 l, C/ E8 H! i1 @0 T
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/    $ R9 K# g, [& n2 r, r1 p* J
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md   
    0 ?, O& D: t0 n( z( m, k) l
  • https://github.com/dotnet/runtime/issues/11012   
    / F9 }* J4 L, t$ i' y& X. k6 O! x
  • 关于大对象使用的注意点以及官方blob gc的实现描述, \) R! P. p& e3 j
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!4 j3 O- H% U3 K6 \
, j4 {% Z. Q$ o! j$ }& Y* @: f
来源:http://www.jb51.net/article/232931.htm  V, d1 G: v- U2 g+ X$ g; d
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-25 10:57 , Processed in 0.036894 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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