|
|
目录
0 y$ q, o7 S8 d' c; y# l H) r$ }& n! q3 a
& \; C, C1 E: |5 G- 安装
- ^, t4 M4 \9 t$ M4 ~ - 验证' w: ]$ b8 B+ Y4 a: F
- dotnet-dump
% _# i* ]2 ?6 V, S) c - createdump! H; s: n h( D0 L" G' Y& R- Z
- 分析coredump文件+ _) X. `6 i8 k% \& O" w: m; w% V
- 相关资料:
; u+ F! w/ q6 \) k. `* }
; W2 d& b+ B/ k2 F( m) v# O, e安装
2 I7 z; Z. M/ ]$ R- ]9 ]8 w& n$ N2 a
+ a7 O" u" C5 @: L # B t& ~' e1 o
- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像
/ O5 A7 X; z9 e - 准备Dockerfile
4 p3 M% J4 @* y$ e - 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
复制代码 验证
) Z+ f$ T( q5 n' }' G4 `& y, k {
f6 b! V$ O I6 z4 Z基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多2 ~9 H+ w6 O$ H/ v% n
用我们刚才制作的基础镜像随便起个demo程序验证下8 w3 n& H7 Y0 {
C, T8 o6 ~& m# L+ e
- 已经包含了tools文件夹了,里面存放了我们的tools工具
/ n0 o. B, x- _: J" E3 k& Z1 ^ 3 R. ]+ g0 @! u& W4 j% \6 [
; Z; ]+ V0 ~& @- `% \, d0 f4 O/ H% F
0 S" a0 f$ }2 c( I- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)
: |4 S4 c8 }( r* v0 Q s
, w& F. a6 f4 Q, I2 m8 c$ q至此包含tools的runtime基础镜像制作完毕。
o% Y; T. t; F3 m! t+ p/ j8 j+ {& l# Q" D
dotnet-dump+ L% d4 z( b ?4 x9 ]' ?
( h+ ~ Z% ?0 m% F* [2 T3 b
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致+ ` X. n- E& W+ C F
$ Z) V! k( u. x. i S. Vcreatedump
8 x# e: X5 y( G8 G+ N8 I
! m0 b1 b0 f( ]; K2 P它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法
% J- r- Q w: L$ ^+ j虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
Y& B0 V; P/ J. _6 p, X- w {这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
! S9 G& f: A& z# v开始使用:
8 j- v/ L& G+ Q" |( H0 f/ v
. i/ H" g8 s4 p8 f& W- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)" N( m7 ?# B& ]' a/ R
% G& C7 I! o; [/ ^/ l" B
3 L) W4 a g; D, Q- H' z) ^ |- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功
2 t$ E: u2 K5 {! f1 G+ v- O! X - 如果报权限相关错误,可以在你的yaml文件里加上:6 X) m6 n+ ^+ K; [
' a7 L' C- K$ C5 s
9 ~: b+ c9 x7 r2 }/ e6 s% H9 V分析coredump文件
2 C1 Y. Z! [7 S) Z( ~" ~/ d# J) }$ u
先将上面生成在tmp下的coredump文件copy到可以调试的地方
' H, p) ?7 {2 S: dkubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s& Q0 M" H0 _$ a+ L5 \
6 @5 f' r/ k5 U& Y H" n+ c; ~然后为我们的coredump.1文件下载关联的symbol:9 |* B7 Z8 i+ I! h, ]: M2 d/ g
如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
t3 k5 n3 |) }8 z1 f5 N# n/ B9 b R( t: H
8 @$ B: u. v# b9 x! f- A1 V+ L3 q- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm . R8 Y! a4 I" e0 \3 u+ {
- sudo yum install dotnet-sdk-3.1
5 W6 \9 ^. A) | 如果dotnet-symbol没有安装的话,安装一个" S0 F% h- s( c# }" c
( u) }, _4 b O2 v
5 S# J# K. N/ R+ c& E
- dotnet tool install --global dotnet-symbol
& X* I4 f2 `" a% v7 }( C5 u: o - 然后关闭当前终端,再打开一个新的% r* t, d. h. S
然后执行dotnet-symbol --host-only --debugging coredump.10 ? I: ]" A- o3 }
. M8 T0 @6 E' j) ~2 ~
% D8 g% u( Y8 W7 i- [* p8 h) O! n
8 Q7 U! I1 J5 ^7 }$ ~/ `0 |& O- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样3 U+ E1 W$ K( Z* H6 b
' h9 }2 D: Z8 {6 [$ F: g; l& d5 m
然后我们使用lldb进行调试
# r# ^: u7 ?: H. I4 G- j$ y& a$ |
3 a6 F1 u6 B; D
- 如果你机器里没装的话,先装一个吧 1 u" A' H# R6 O+ }; [ e
- 安装sos插件:. ?0 ~, g" P% O* S! w
. q/ R4 C$ E: ]9 Y! }) B- dotnet tool install --global dotnet-sos
8 F) S' `1 P7 w) y$ ?; X - dotnet-sos install - S9 S/ s+ t5 O* o/ ^2 |8 h8 K1 W
% }. l; v- y' y c9 q - lldb-8 --core coredump.1 8 E* c! M8 E- w' Y, \0 k/ z, S
- 然后就可以用lldb来分析dump文件了3 t0 @ C( V1 Q m
7 |8 U6 ]6 `% U; u/ O/ `0 K
相关资料:6 y @ l. Q: C
/ `+ f6 W: n9 U2 v! W M g : a: N0 y! I2 ^0 ^
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol 7 e {5 }' Y/ q. l& n
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md
8 @+ w* V1 ~# i- N( ]* s, n6 H - https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/ % R, o! d2 Z+ ~* y- O4 |
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md % s" M+ |- j$ Q+ I4 d8 Y& n! Z
- https://github.com/dotnet/runtime/issues/11012 5 ?) B5 U6 L7 R$ H) H' ~
- 关于大对象使用的注意点以及官方blob gc的实现描述
" A( P; Q) }1 k 以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
9 G" A1 b2 O6 w5 z- ?
: y* i) g$ n" L' E5 w& `" P来源:http://www.jb51.net/article/232931.htm9 ~" W" F" \7 L% v* i# o
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|