|
|
目录
* 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 - 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免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|