|
|
目录
3 G/ H7 r0 O" b* l# N
7 L! ` w# W1 b9 o/ W$ A. t! w4 |3 H( v: g: v$ P9 ~- o/ W
- 安装
7 E7 v* y7 s$ G7 g |+ N - 验证
~: O+ Q+ O( X* f( t - dotnet-dump9 e* P- n6 F) B h. v
- createdump4 e/ I7 a' [, P) d/ k4 D
- 分析coredump文件
" g* s1 a9 j! \1 L: ~ - 相关资料:7 @5 G i0 c5 I6 Z6 U T3 t
8 E5 Q- [ Q/ J- ^# b' h' D6 p安装0 {9 L" ]) {* n0 ~" R
' R+ L; N+ `1 n
9 n/ Y) K2 A% J" f, o* p- 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像
: i5 f* b6 Q n h- m/ W1 j$ O - 准备Dockerfile- X/ Y" m, b/ p( t- L8 h9 y; c
- 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
复制代码 验证/ `2 D- v$ s0 S; E( d
e& r! g0 p3 E5 D
基础镜像做好了,查看下镜像的大小应该就比runtime的大小多几十兆,相比为了使用dotnet-* tool而直接采用sdk的话,体积小了很多很多
' D5 {7 t- h+ l+ j# `6 {( m用我们刚才制作的基础镜像随便起个demo程序验证下. L; o5 r) i6 }# p. ?
' D2 S+ t+ g' B8 {' o
- 已经包含了tools文件夹了,里面存放了我们的tools工具
0 n& p5 w( ]" F9 ^- W
, ^, X; [5 q4 _
* p- ]0 T$ N5 ^7 L2 X 4 K: I) s: F6 j+ `0 k4 V, y
- 以dotnet-trace为例,测试下是否可用(ps:注意使用方式)5 { j0 h3 w4 G5 s4 \
7 s1 V/ o7 y; O' i
至此包含tools的runtime基础镜像制作完毕。+ d; ?& j+ B: K( b0 T
, U; [/ L- @* W9 v: Tdotnet-dump7 Z/ v7 q; }7 C$ ?3 Q" a
8 G. s/ u+ m4 p/ i% x7 ?# E
它只能收集托管内存,不能用于条是本地代码的问题,而且分析它所创建的dump文件,必须和当前环境保持一致/ a& I' V2 j! ^) m- v- i) r- o6 E) e
2 }0 n0 d- Y4 m& Z8 ~% |" {
createdump
7 S/ m/ P1 q4 x' d9 y4 a0 p# U$ U- Y9 \( V8 w5 ]9 P2 ~
它既可以收集本地信息又可以收集托管信息,是一种比较全面而且推荐的方法% @3 n& X- K9 }6 g5 C/ Z
虽然gdb、gcore也能起到同样的作用,但是他们可能会在收集的时候错过一些托管状态,导致最后你分析dump文件的时候有”UNKNOWN“的错误
- h9 J$ T3 x& z J- i这个工具是伴随着.net core runtime安装的,目录一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
$ T* E( ]. }3 S8 ^0 W3 y; s开始使用:
# g8 s( ^ s8 [' P( i ' }( {2 W& _. j8 v
- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的进程id)
. {+ t$ o7 v3 i+ l$ C% |3 e2 n
" ]$ Z- k$ K! E# |/ w
0 M9 G$ p1 a, ?0 W1 c5 Q7 y" m4 U- 他会将coredump文件生成到容器的tmp目录下,至此没报错的话,说明成功 + {9 Q, l+ _4 L% W) l% ~6 l
- 如果报权限相关错误,可以在你的yaml文件里加上:7 F/ l1 I! D2 S) i/ Y
4 s1 ]: n8 N* b, ?/ j& c+ f( m
# K" }- O3 ?5 f$ g分析coredump文件
6 w4 F! h, w% Z; F
, a$ G; A1 `$ @+ c( x( _先将上面生成在tmp下的coredump文件copy到可以调试的地方+ v4 |# p6 I; q y; I
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s$ y$ p. g' n+ ~; N% q( I2 H: I! L
6 y- t% J9 [0 O. h1 \
然后为我们的coredump.1文件下载关联的symbol:
. N! [4 n7 Z( K如果你准备分析dump的机器没有dotnet sdk的话,先装一个把
6 Y* l- L. I7 O/ P" X/ }2 E$ i8 G' N* [0 U/ j& } m& I
; o7 M/ d; B: J( H* {* _8 f
- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
. P9 O; Z6 k& `( I% n! i7 ^6 X9 M* d - sudo yum install dotnet-sdk-3.1
& i0 `5 G- x4 a* T( G | 如果dotnet-symbol没有安装的话,安装一个) x- u6 I2 `& B8 I
0 A" P& M0 ~, C! C0 E+ k5 l
4 Z7 @/ _3 z% N0 Y- }; Y- dotnet tool install --global dotnet-symbol % [ Z- E6 D, Z5 N }
- 然后关闭当前终端,再打开一个新的. O% s& B# l; e* I. H- ?
然后执行dotnet-symbol --host-only --debugging coredump.1
8 ~, q: G, E& C) O0 W- s" x$ m7 g
; N6 j: r/ c/ \
& K% b) ?+ g, q- c6 f2 v! D 5 E" V, K6 P/ S0 B/ q' G
- 看到dac,dbi文件写入就代表成功了,这时候你的文件夹应该长这样0 V; B7 ~1 [( O) N1 ?
4 ?9 w8 _% t0 [然后我们使用lldb进行调试
6 ]3 H9 }* `/ _2 X$ a, J t& K# o) i- D1 a5 l
( q( J/ k9 D7 ?! J* C# r5 u- 如果你机器里没装的话,先装一个吧 ; N' _/ C b1 R1 J; x
- 安装sos插件:
6 G; \ h/ w/ @ * h; H9 i4 m! d( {; t6 t- [( S
- dotnet tool install --global dotnet-sos 5 g9 S) U, G: j L' ]6 A$ s
- dotnet-sos install ! R$ ^3 \+ l8 z+ ?
, B& T0 t/ ]* K m" Z1 u6 R - lldb-8 --core coredump.1 ! a$ k. B, c" V, Y
- 然后就可以用lldb来分析dump文件了
2 C# m( `( k/ a% J" \7 |& p1 q 5 e* w9 k4 v8 H* Y' U+ I5 v3 V& a
相关资料:
# P+ K+ L, F) O0 b$ {
6 N7 r* B( x8 E8 v+ T0 B ; h* ]" `1 K. P! |: ^
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol ; `" g9 W5 H7 V& x1 s, l! ~
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md ' g( ]5 t6 H& j# `: w+ M- u
- https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/
7 ?, U! N- ^& h - https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md
* l: Z0 s: g; o1 C7 f. T( N - https://github.com/dotnet/runtime/issues/11012
; `/ K% t/ e' @# u. M - 关于大对象使用的注意点以及官方blob gc的实现描述
5 t6 A+ p, y" a7 v R; J0 R& @ 以上所述是小编给大家介绍的正确使用dotnet-*工具的方法,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!% y2 F! s1 {$ }* ~# k
1 [: y# b3 _: `' C, E来源:http://www.jb51.net/article/232931.htm y' ^9 q) ~6 L, z7 K0 d/ f
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|