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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6592|回复: 0

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

[复制链接]

26

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-13 08:35:56 | 显示全部楼层 |阅读模式 来自 中国
目录
* l, ^4 a& m; @" _3 I' I$ ?! e/ I

    2 L) g: j1 s! B% I  p4 W. A  s# o
  • 安装: M, @/ s  Y" e1 L. o( ?/ c
  • 验证9 X5 Z: U& O0 U
  • dotnet-dump
    ; _$ c5 F+ f: E; E- N% S
  • createdump$ M+ }: d( I. r3 i! s8 m9 f
  • 分析coredump文件' p$ c6 I: ~1 m) U. G) o
  • 相关资料:, `8 ~7 p3 I- G* q, @: X

9 `# a( ^  e, S安装6 |3 A" {9 q* R+ r/ r1 ^3 S: s# J* n

" ~6 S1 d' ~3 F9 o5 j+ B
        3 k. \& n! }; L4 G  F
  • 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像   
    2 O9 R/ S# `, z6 `8 o4 K
  • 准备Dockerfile
    . }  ?2 _, H. y4 F) y
  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
复制代码
验证
3 R9 ~  \/ A/ n$ b
- m( }( W0 L% I# h: t  D% m( z" S基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多3 o2 T8 U# V3 {) P  u
用我们刚才制作的基础镜像随便起个demo程序验证下+ y5 s! U$ l2 C) y7 v' ]9 b! {
       
    3 K* m  z4 O3 b4 O0 P0 m! T
  • 已经包含了tools文件夹了,里面存放了我们的tools工具
    , x" V2 t/ Y1 f" K/ T' D
7 n% j4 _6 o& Q: j+ o- u
9 c8 ~/ ?: N$ B& a, @/ U0 c0 @5 r3 ^
       
    " P0 C* |% H/ Q" {: o
  • 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
    - J: \# o4 p9 r7 y$ _# a
( d, V& ?3 `( F* l
至此包含tools的runtime基础镜像制作完毕。
/ M+ }2 s4 s! j8 W
7 a. t7 f* P1 W7 zdotnet-dump
6 w% [& E9 r( e6 A4 I" W0 f& i" c. [5 U7 O4 D
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
: S! @6 Y$ `1 m  D/ s" [
# `: V# N; p$ ~* l5 U! e5 A8 Acreatedump$ F- r$ A0 x: k
- @. _7 K: X* S2 w& m+ p3 w, j
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
, n4 T2 M( g  p: M% c  o0 O虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
9 `, U8 c/ e% z0 @+ w这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
% j2 j9 o7 `0 S$ ^. S" Q3 }/ o开始使用:
% _" R3 u, ?, `* ?
        8 Z% _& g; M  s. F( D8 q
  • /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id); g4 t; x! O3 f/ @8 s8 b4 X& Q
  l( b+ a2 f7 b7 d  S8 D  }
       
    0 m. @4 {  c8 J" g$ t, A
  • 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功    , M  N7 t3 C2 z0 m" }
  • 如果报权限相关错误,可以在你的yaml文件里加上:
    ' Y/ Z* D# r" W3 V

* }" E2 g0 _! o" o& q8 o" n2 K: U6 @# o3 u
分析coredump文件
& z3 F+ F+ Y* R( k5 r! V$ n
8 s1 P; G4 ~2 ~2 v- h9 u先将上面生成在tmp下的coredump文件copy到可以调试的地方! j6 X; z' |- o) a: U1 a* ]4 q
kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
/ _2 \) n' w, u, W) Q: _( F" f
+ @9 @: D6 @7 r3 n! U! i
然后为我们的coredump.1文件下载关联的symbol:. n& A+ P7 x& q( o4 d
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
1 x) Y; a" H% F
- M5 s$ o) S5 t6 @5 q
       
    + p# z9 l$ c* y) O4 p
  • sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm    " A  P8 U/ `1 }! e8 X+ U5 J
  • sudo yum install dotnet-sdk-3.1' ^1 k5 G3 l2 e) y
如果dotnet-symbol没有安装的话,安装一个
. q1 n& J4 E6 w6 x
0 z8 p; ^! U: X0 }5 G
       
    1 x5 k7 _* M5 X, ]
  • dotnet tool install --global dotnet-symbol   
    8 v7 X, _; X# |# e
  • 然后关闭当前终端,再打开一个新的
    % G; ~; x! u8 H* F5 n
然后执行dotnet-symbol --host-only --debugging coredump.1) P. t% y4 I  J; V2 L9 N. B

! Q' w) a8 t. p1 w# P$ A/ i8 @; w
& u$ V! S. v3 a3 s, J
        # s' p* F9 @7 _( D
  • 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样: F* Q8 V$ ~% ?$ ^& y# p7 V

# L$ Y$ \8 C' t然后我们使用lldb进行调试! w, ^$ V- Z8 Y( c. v; r! x
, ~5 k- u% ^' D9 c/ g
        0 @, ~+ S5 ^$ l8 i# q$ r) v
  • 如果你机器里没装的话,先装一个吧   
    , ~% B1 u7 E, C. Z0 ]4 C/ w' D4 Y  }
  • 安装sos插件:7 D2 ^( j& F% I1 E1 }
              
      , S% V& _3 d; p
    • dotnet tool install --global dotnet-sos        
      , E. G5 C0 t) F9 E2 M% d; r
    • dotnet-sos install    7 }6 |$ t( m5 u; n# K0 J* r" R
            - E( J" h, J# a
  • lldb-8 --core coredump.1   
    * ^8 e3 ?- k0 y5 {( G5 X! A
  • 然后就可以用lldb来分析dump文件了
    1 I8 v) A; g8 P

, L- V3 D" {' f  s9 ~相关资料:
0 n0 B' b& X' f: [8 X- G0 z$ x- d8 u; `9 x
       
    : \: v+ @# g) |+ ~; }
  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol   
    2 [8 ^6 C% B  L. y" k
  • https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md    ' Q) g/ x4 n+ e4 i& S- L# c
  • https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/   
    ' x/ K/ N% R$ o% m* o4 p/ Q" Y
  • https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md    " |1 w" E$ b. B2 y6 R
  • https://github.com/dotnet/runtime/issues/11012    4 @! s; f6 o6 w7 G' V
  • 关于大对象使用的注意点以及官方blob gc的实现描述$ E% S: E9 L! \% ~
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
4 n; _2 ?, p" M! L5 U8 G0 c9 t1 Q" q/ ]: ]9 Z# z
来源:http://www.jb51.net/article/232931.htm
" C& {0 }) B! ?6 K免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

×

帖子地址: 

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-25 12:43 , Processed in 0.049328 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

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