|
|
目录: B% J/ }8 w# M: t/ K
2 J# W& a' x) X% V* w. a' @" |
1 M: d- y9 n' g, `- 安装
% z# C# ?: H' B/ W' s% R - 验证
# q" ` ~0 J4 d) j3 @ - dotnet-dump
0 B. V1 E7 W( }! y5 X* y& P - createdump
5 o4 z3 O1 d7 R: ?# {% ^ - 分析coredump文件6 s x6 U2 M6 f+ o( s
- 相关资料:: O, `- z' _! w. p" Y, d. `
4 i) x, l; f( B/ A: m# L- q安装
+ \7 H8 w* ]' G! O6 |
' M/ D) S9 h7 f% j7 o- W / ~3 K2 A+ \/ H% q, g q
- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像
, w: G( |3 X/ Y! W& g - 准备Dockerfile
5 b& F& b4 h% l - 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
复制代码 验证4 {, B1 A' \$ z! L
+ o9 P) C' E: \1 z7 K' d4 X; a% m {基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
" K" z/ w! Y/ x/ x0 w* W用我们刚才制作的基础镜像随便起个demo程序验证下
! S3 ^$ T! V7 Y. f2 c( \( n
/ Q! P3 w; a( Z- 已经包含了tools文件夹了,里面存放了我们的tools工具; `/ B, p8 Z! n( U
1 M% e5 Z1 U& u- n: z! M; h& c
! b6 y/ Y$ ]1 M- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
/ V e1 j. i, b3 n2 c
. p% [3 o o* Q8 P$ K至此包含tools的runtime基础镜像制作完毕。
" q+ {/ t8 p% H/ Y# L& A7 R. \% V
: c! O# J) V" F. ]0 h5 o2 _& sdotnet-dump
% I2 F1 ]: c% c' P& ~9 a) p0 b* `3 k' E- [
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致8 y, ^$ ~# T0 G& T* O+ d
- t2 \7 a4 D8 {$ r! k7 j
createdump, i# y4 M' [+ y
7 \! d) D' m- M- C% ]# ]它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
& J9 w) K+ w2 b. C& r: T虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误9 K5 I I' ~- J9 \& ~) r0 j
这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
" T8 ]! i! D; U$ Q开始使用:
8 Z. u. `; V+ v2 ]1 \2 \
( k8 s1 @) X, j* {# U* e4 }- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
* I8 k% _6 S0 M. U: j ( k+ ~4 t- w( X& m$ `7 A$ k$ \
& K X4 R3 o6 L% s8 _ A- n; f$ c- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功 , A" u7 k+ w& m. \$ z0 I5 L! Z" M
- 如果报权限相关错误,可以在你的yaml文件里加上:1 B& r- X0 P, x0 }; X) O+ ?9 `' g
% J/ ]0 L$ C+ |3 d2 b, k: H: K1 @' b$ v
分析coredump文件9 S( k, S% @. a d
' g9 m! ~' h7 @/ X先将上面生成在tmp下的coredump文件copy到可以调试的地方 R6 w+ Q4 m; V
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s) @+ H2 [% @" Y. |5 Y) c/ U/ c! m
$ i1 E2 n/ l% _) S9 f" `
然后为我们的coredump.1文件下载关联的symbol:2 y! ]& w) i N
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
/ j1 j# {% |# z; D
+ s/ c( c; T# H2 Q% J. }" V) ~
, N) o( s' ?! x. G" ^9 @9 h: N- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm ; g: w0 |! X/ R- r4 j2 c
- sudo yum install dotnet-sdk-3.1
+ K+ f5 }/ N/ N% g& Z- O 如果dotnet-symbol没有安装的话,安装一个; A1 h, R8 l7 z( G! B) O
( {) U9 o4 U# J& h9 V( K
: I, q6 Q+ |7 V- dotnet tool install --global dotnet-symbol ) p+ Z+ r/ X+ r7 H/ ^& `( I
- 然后关闭当前终端,再打开一个新的
4 m/ ^' o7 `* q( i3 f) |2 H3 B 然后执行dotnet-symbol --host-only --debugging coredump.1# Y2 W2 q: T! Z7 y; K
- B T3 v# {& n+ x. h7 A& o7 x
. t$ k1 o3 E# y B4 l1 M ; ]) o7 D) j" `% w0 ]8 e
- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样
! q/ X! r' r) z4 S
! \: p5 `4 D9 {然后我们使用lldb进行调试% t7 ]$ M( G) \0 Q, p6 ?# B* Y
& x. I v# g/ d$ Z
0 P' l6 e/ p$ v- 如果你机器里没装的话,先装一个吧 * l% A6 I3 y9 y$ U* D+ j
- 安装sos插件:
: m% @/ o6 C# T* f9 N
% r: n; }' G2 u/ u# m! b3 c* X- dotnet tool install --global dotnet-sos ) E# B; D! D' k
- dotnet-sos install 5 w) {6 D: O5 u( o; z7 t' n% k
: ]! R/ m! F) ?2 }. W: b
- lldb-8 --core coredump.1
2 n+ w8 M% U3 u - 然后就可以用lldb来分析dump文件了
, z1 A8 P' `: } ?
6 S4 c4 N# k) ~ R3 B, y5 W相关资料:! E5 j5 |* R( z3 {- ]
t8 r' U& C& i/ S* k. t
/ k& d! ~. J0 f: y! {/ ~( N- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol
+ e% ~' l$ v: E9 f& s - https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md & n' {7 G% p. z _/ X$ } }& g6 n
- https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ @% n) m, l" c5 _9 I
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md " I! A0 Q; w2 {5 z% I: R' J
- https://github.com/dotnet/runtime/issues/11012
$ \8 P; y: a' S3 O Z - 关于大对象使用的注意点以及官方blob gc的实现描述
, D! w# v/ o5 m1 W0 c2 U 以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
* A& [! } Z, y- h2 f( }' H* d6 E# ]0 F* E* m% b4 k
来源:http://www.jb51.net/article/232931.htm6 ?0 I$ ]5 B. M4 j; }5 S
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|