|
|
目录( h9 V! D0 K- I
3 o7 X: K" L- T! V5 s7 A
6 L8 o2 H/ O7 D% ?6 K; Q/ O
- 安装
' o/ j7 x1 x4 T" }2 b - 验证# Z& u+ K+ F" X& N
- dotnet-dump
# w- ^( j2 Z; w' [ - createdump
! N# X- h1 h* K! g - 分析coredump文件
& D% N4 l+ P" Q o4 s - 相关资料:
. C6 N1 f* Y, p# z2 w: \* t ; F3 Q: b: G4 B4 \0 ?2 t- x
安装' u- e8 S7 h9 g
3 s+ r- b. u! ]. Y : q5 E: p3 h8 [6 i
- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像
: j2 _# Y M; O" q) i - 准备Dockerfile) l4 \) ]9 L; t2 g
- 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
复制代码 验证
' k# u$ [! H, R6 _1 \5 V3 ?0 e1 m2 k% L1 Z! A3 E, @3 W' L4 K/ g
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多6 {) [$ a$ }4 I& l
用我们刚才制作的基础镜像随便起个demo程序验证下8 x7 |1 D3 H2 |6 u- |' G; h
. h# J0 m4 u/ e: s4 ]# G& Y
- 已经包含了tools文件夹了,里面存放了我们的tools工具 ?: P/ D: r4 x1 e* k; O$ @5 r
4 V0 i# Q7 z" {5 e4 f8 n9 U9 |6 r# u+ h3 e
7 M3 L* e3 h- I, L) X- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)7 F6 S+ {+ `, b* G H Q) ~
^( M/ r( S v- H5 Y. V6 t
至此包含tools的runtime基础镜像制作完毕。
& S1 D/ m) y4 p P0 h' m) e+ ^" a4 V0 I- n
dotnet-dump# @. \6 F! o0 C @1 h3 P" u
$ q5 x; F5 k, w% Z$ ~' @" p* T它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致
! o3 h. c1 ?% M8 l& K# h2 d
( Q7 O# t, x4 Pcreatedump
, d& V: q; R- G: T a* ]) J0 J& P
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
! t! s$ D/ e3 U* @. q' j, i# O虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
2 J5 C$ e+ M4 Y( B8 C7 R- x$ U这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
1 X5 g; q$ }4 N+ f开始使用:+ W, p& S5 K% {# p
+ e( N% G( f' u' h* E7 R- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
! A6 ~2 S- }" Y, l3 G , l4 L- X3 [: D2 d* O' b U' g/ \3 h
- \) a3 ^6 N5 F( j3 ~, ]
- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功 * T( u6 d( A) v2 d6 A
- 如果报权限相关错误,可以在你的yaml文件里加上:
4 s! l/ @! {: O3 j) r9 V# W. Q! q
1 B! f" d& L/ g4 J& O& e
- P1 }4 b# U( F! W# u3 W6 p分析coredump文件( W0 r" E, u( `+ o$ C
5 z& H- L7 K7 M先将上面生成在tmp下的coredump文件copy到可以调试的地方
; Z; A* |) @; _% n# d5 V' \, f, tkubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
( r' l8 w3 C/ M/ R" [; M) \ b- `6 j. q3 P0 f- h, {9 c3 r' t% Z7 E3 j
然后为我们的coredump.1文件下载关联的symbol:
7 f7 o+ D9 O6 V, g如果你准备分析dump的机器没有dotnet sdk的话,先装一个把) q5 Z2 h R) }8 j. D' h( `
- Q5 Y/ O' s" ?4 T( F, M
( {0 v* W% V; s/ z- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm 4 S. A( E" ^9 o, V
- sudo yum install dotnet-sdk-3.1
* q# r6 i4 @! V% h. Q* e5 ? 如果dotnet-symbol没有安装的话,安装一个
* y/ @' z% o( z3 `9 S( }* _
+ M0 H+ T& z% }4 \. q* w- o
( _$ ^, R2 y7 i- dotnet tool install --global dotnet-symbol
1 r/ K3 o; i) O5 J- b+ P - 然后关闭当前终端,再打开一个新的1 l1 @! M7 ^/ e: b. v/ |3 Q
然后执行dotnet-symbol --host-only --debugging coredump.1$ J% _( o. `. i
: ~3 S) p& }+ L$ q7 [& m! |- Q, a: e/ i: a) N- j2 a; ]
a* W7 M' ^) e4 S7 o# \; x# i+ ^- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
3 J- I& t. ^( U* T; b/ O( Q . _$ k! b' j' ~' L- Z
然后我们使用lldb进行调试. M1 o# N+ ~+ Y3 o, G4 V; N- r$ U
! A9 k6 J+ S, N1 F* e 0 x( l8 k E0 C* \9 a+ @9 h5 K
- 如果你机器里没装的话,先装一个吧
! R8 {) P4 M0 Y" G8 X* f1 @3 N' o - 安装sos插件:
6 k6 U, b; }5 E6 `" |& ^ 6 ]5 a, `6 P* {, Q+ [- z9 L
- dotnet tool install --global dotnet-sos , d2 ~. L' U- L
- dotnet-sos install
9 N( f0 M' n$ X! J 1 g( f7 E6 m8 C8 h, f4 G
- lldb-8 --core coredump.1
! R& W% ^8 D; _% d6 L - 然后就可以用lldb来分析dump文件了
% t; ^1 t+ H6 |' N8 \% O H* t8 L+ f- o3 ~7 s
相关资料:
& x. w% o8 S& G8 t7 B O5 `+ P! ?
1 Z# p2 _4 n& S0 k: H% X/ R+ l/ k
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol & T: Z* _8 N7 I8 k
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md : S6 }+ ]8 N2 g$ G0 w% K5 Y( i5 M
- https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/
' I! J' j3 [. B) f - https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md . C/ v0 v0 D- O( @) ^3 m2 x3 o
- https://github.com/dotnet/runtime/issues/11012 7 @5 u1 N% U4 ^# T2 Q7 l% t I0 @
- 关于大对象使用的注意点以及官方blob gc的实现描述8 G8 A/ q. [, D0 l4 N3 X7 B; T; O
以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!8 @; u. q3 z4 x/ |. W
3 t, {9 J. a( \7 G s来源:http://www.jb51.net/article/232931.htm
" U1 |# Y+ j, r1 A7 }. H免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|