【原創】Erlang 之 erl_crash.dump 文件生成

本文內容針對霸爺的博客《 產生crashdump的三種方法 》進行實驗驗證和總結。

-=-=-=-=- 我是<我是歌手 >的分隔線 -=-=-=-=-

(如下爲原文引用)

      crashdump 對於 erlang 的系統來說如同 core 對於 c/c++ 程序同樣寶貴,對於系統問題的修復提供了最詳細的資料。固然 erlang 很貼心了提供了網頁版的 crashdump_view 幫助用戶解讀數據,使用方法以下:c++

crashdump_viewer:start().

      由於 crashdump 文本文件裏面記錄了大量系統相關的信息,這些信息對於分析系統的性能,狀態,排除問題提供了不可替代的功能。因此很須要在系統正常運做的時候,獲得 crashdump 文件。
      除了坐等系統在發生問題時,自動產生 crashdump 之外,另外還有三種方法來手動產生 crashdump 。 方法以下:shell

  • erlang:halt("abort").
  • 在 erlang shell 下輸入 Ctrl+c + 「大寫的A」
  • kill -s SIGUSR1 [erlang_pid]


-=-=-=-=- 我是<我是歌手 >的分隔線 -=-=-=-=-

(如下爲實際驗證)

【實驗一】

某業務進程運行中cookie

[root@Betty upu]# ps aux|grep upu
root      2185  0.0  0.0  12908   796 ?        S    13:03   0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' 
root      2186 12.3  1.1 507936 43688 pts/0    Ssl+ 13:03   0:00 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console 
root      2237  0.0  0.0 103252   848 pts/6    S+   13:03   0:00 grep upu
root      2525  0.0  0.0  10956   396 ?        S    Feb01   0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon
[root@Betty upu]#

經過 remsh 登陸,再經過 Ctrl+c,a 退出async

[root@Betty upu]# ./bin/upu remote_console
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]


Eshell V6.0  (abort with ^G)
(upu@Betty)1> 
(upu@Betty)1> 
(upu@Betty)1> 
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution
a
[root@Betty upu]#

能夠看到,上述操做對業務進程無影響(不產生影響的緣由見後文)。性能

[root@Betty upu]# 
[root@Betty upu]# ps aux|grep upu
root      2185  0.0  0.0  12908   796 ?        S    13:03   0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' 
root      2186  3.1  1.1 507348 43600 pts/0    Ssl+ 13:03   0:00 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console 
root      2328  0.0  0.0 103252   848 pts/6    S+   13:03   0:00 grep upu
root      2525  0.0  0.0  10956   404 ?        S    Feb01   0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon
[root@Betty upu]# 
[root@Betty upu]#

再次經過 remsh 登陸,並執行 Ctrl+c,Aspa

[root@Betty upu]# ./bin/upu remote_console
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]


Eshell V6.0  (abort with ^G)
(upu@Betty)1> 
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution
A


Crash dump was written to: erl_crash.dump
Crash dump requested by user已放棄 (core dumped)
[root@Betty upu]#

能夠看到,上述操做對 upu 進程一樣無影響(不產生影響的緣由見後文),同時可以產生 erl_crash.dump 文件.net

[root@Betty upu]# 
[root@Betty upu]# ps aux|grep upu
root      2185  0.0  0.0  12908   796 ?        S    13:03   0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' 
root      2186  0.6  1.1 507604 43864 pts/0    Ssl+ 13:03   0:00 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console 
root      2463  0.0  0.0 103252   848 pts/6    S+   13:05   0:00 grep upu
root      2525  0.0  0.0  10956   408 ?        S    Feb01   0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon
[root@Betty upu]#
[root@Betty upu]# ll
總用量 360
drwxr-xr-x  2 root root   4096 2月  26 14:27 bin
drwxr-xr-x  2 root root   4096 3月   1 16:53 data
-rw-r-----  1 root root 334226 3月   4 13:05 erl_crash.dump
drwxr-xr-x  3 root root   4096 2月  26 14:27 erts-6.0
drwxr-xr-x  2 root root   4096 3月   1 16:52 etc
drwxr-xr-x 12 root root   4096 2月  26 14:27 lib
drwxr-xr-x  2 root root   4096 3月   4 13:03 log
drwxr-xr-x  3 root root   4096 2月  26 14:27 releases
drwxr-xr-x  2 root root   4096 2月  26 14:28 system
[root@Betty upu]#

此時就能夠基於該 erl_crash.dump 文件對 upu 進程的運行時狀態進行分析了(此結論已被我本身證明存在問題)。

【實驗二】

某業務進程運行中code

[root@Betty upu]# 
[root@Betty upu]# ps aux|grep upu         
root      2185  0.0  0.0  12908   796 ?        S    13:03   0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' 
root      2186  0.1  1.5 507936 58048 pts/0    Ssl+ 13:03   0:01 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console 
root      2525  0.0  0.0  10956   412 ?        S    Feb01   0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon
root      2928  0.0  0.0 103252   844 pts/6    S+   13:21   0:00 grep upu
[root@Betty upu]# 
[root@Betty upu]# ll
總用量 36
drwxr-xr-x  2 root root 4096 2月  26 14:27 bin
drwxr-xr-x  2 root root 4096 3月   1 16:53 data
drwxr-xr-x  3 root root 4096 2月  26 14:27 erts-6.0
drwxr-xr-x  2 root root 4096 3月   1 16:52 etc
drwxr-xr-x 12 root root 4096 2月  26 14:27 lib
drwxr-xr-x  2 root root 4096 3月   4 13:03 log
drwxr-xr-x  3 root root 4096 2月  26 14:27 releases
drwxr-xr-x  2 root root 4096 2月  26 14:28 system
[root@Betty upu]#

經過 remsh 登陸,並執行 erlang:halt("abort").blog

[root@Betty upu]# 
[root@Betty upu]# ./bin/upu remote_console
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]


Eshell V6.0  (abort with ^G)
(upu@Betty)1> 
(upu@Betty)1> erlang:halt("abort").
*** ERROR: Shell process terminated! (^G to start new job) ***


BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution


^C[root@Betty upu]# 
[root@Betty upu]#

退出後發現生成了 erl_crash.dump ,此文件大小比經過 Ctrl+c,A 生成的大(大的緣由見後文)。進程

[root@Betty upu]# ll
總用量 1404
drwxr-xr-x  2 root root    4096 2月  26 14:27 bin
drwxr-xr-x  2 root root    4096 3月   1 16:53 data
-rw-r-----  1 root root 1400355 3月   4 13:21 erl_crash.dump
drwxr-xr-x  3 root root    4096 2月  26 14:27 erts-6.0
drwxr-xr-x  2 root root    4096 3月   1 16:52 etc
drwxr-xr-x 12 root root    4096 2月  26 14:27 lib
drwxr-xr-x  2 root root    4096 3月   4 13:03 log
drwxr-xr-x  3 root root    4096 2月  26 14:27 releases
drwxr-xr-x  2 root root    4096 2月  26 14:28 system
[root@Betty upu]#

能夠看到,此時業務進程已經終止。

[root@Betty upu]# ps aux|grep upu
root      2525  0.0  0.0  10956   416 ?        S    Feb01   0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon
root      3053  0.0  0.0 103252   848 pts/6    S+   13:24   0:00 grep upu
[root@Betty upu]#


【實驗三】

某業務進程運行中

[root@Betty upu]# ./bin/upu start
[root@Betty upu]# 
[root@Betty upu]# ps aux|grep upu
root      2525  0.0  0.0  10956   424 ?        S    Feb01   0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon
root      3365  0.0  0.0  12908   792 ?        S    13:27   0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' 
root      3366 27.3  1.0 511852 38788 pts/0    Ssl+ 13:27   0:00 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console 
root      3415  0.0  0.0 103252   848 pts/6    S+   13:27   0:00 grep upu
[root@Betty upu]#

執行 kill 命令發送信號 SIGUSR1 到業務進程

[root@Betty upu]# 
[root@Betty upu]# kill -s SIGUSR1 3366
[root@Betty upu]# 
[root@Betty upu]# ps aux|grep upu     
root      2525  0.0  0.0  10956   424 ?        S    Feb01   0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon
root      3429  0.0  0.0 103252   848 pts/6    S+   13:28   0:00 grep upu
[root@Betty upu]# 
[root@Betty upu]# ll
總用量 1400
drwxr-xr-x  2 root root    4096 2月  26 14:27 bin
drwxr-xr-x  2 root root    4096 3月   1 16:53 data
-rw-r-----  1 root root 1395568 3月   4 13:28 erl_crash.dump
drwxr-xr-x  3 root root    4096 2月  26 14:27 erts-6.0
drwxr-xr-x  2 root root    4096 3月   1 16:52 etc
drwxr-xr-x 12 root root    4096 2月  26 14:27 lib
drwxr-xr-x  2 root root    4096 3月   4 13:03 log
drwxr-xr-x  3 root root    4096 2月  26 14:27 releases
drwxr-xr-x  2 root root    4096 2月  26 14:28 system

能夠看到,這種方式也可以產生 erl_crash.dump 文件,但業務進程會終止運行。

【實驗四】

某業務進程運行中

[root@Betty upu]# ./bin/upu start     
[root@Betty upu]# 
[root@Betty upu]# 
[root@Betty upu]# ps aux|grep upu
root      2525  0.0  0.0  10956   428 ?        S    Feb01   0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon
root      3645  0.0  0.0  12908   792 ?        S    13:31   0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' 
root      3646 43.5  1.1 512108 42036 pts/0    Ssl+ 13:31   0:00 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console 
root      3693  0.0  0.0 103252   848 pts/6    S+   13:31   0:00 grep upu
[root@Betty upu]# 
[root@Betty upu]# ll
總用量 36
drwxr-xr-x  2 root root 4096 2月  26 14:27 bin
drwxr-xr-x  2 root root 4096 3月   1 16:53 data
drwxr-xr-x  3 root root 4096 2月  26 14:27 erts-6.0
drwxr-xr-x  2 root root 4096 3月   1 16:52 etc
drwxr-xr-x 12 root root 4096 2月  26 14:27 lib
drwxr-xr-x  2 root root 4096 3月   4 13:03 log
drwxr-xr-x  3 root root 4096 2月  26 14:27 releases
drwxr-xr-x  2 root root 4096 2月  26 14:28 system
[root@Betty upu]#

執行 kill 命令發送信號 SIGUSR2 到業務進程

[root@Betty upu]#
[root@Betty upu]# kill -s SIGUSR2 3646
[root@Betty upu]# ll
總用量 36
drwxr-xr-x  2 root root 4096 2月  26 14:27 bin
drwxr-xr-x  2 root root 4096 3月   1 16:53 data
drwxr-xr-x  3 root root 4096 2月  26 14:27 erts-6.0
drwxr-xr-x  2 root root 4096 3月   1 16:52 etc
drwxr-xr-x 12 root root 4096 2月  26 14:27 lib
drwxr-xr-x  2 root root 4096 3月   4 13:03 log
drwxr-xr-x  3 root root 4096 2月  26 14:27 releases
drwxr-xr-x  2 root root 4096 2月  26 14:28 system
[root@Betty upu]# ps aux|grep upu
root      2525  0.0  0.0  10956   428 ?        S    Feb01   0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon
root      3706  0.0  0.0 103252   844 pts/6    S+   13:31   0:00 grep upu
[root@Betty upu]#

能夠看到,這種方式不會產生 erl_crash.dump 文件,但 upu 進程會終止運行。

結論: 只有經過 Ctrl+c,A 生成 erl_crash.dump 文件才無破壞性;

相關文章:《 【原創】Erlang 之 erl_crash.dump 文件分析


==============

重要的補充說明:

  • 上文的一些結論是存在問題的,已經進行了標註;
  • 問題在於上述試驗中,我是經過 -remsh 方式登陸到目標節點上的,即在本地建立一個 Erlang 節點,但在遠端啓動的初始 shell ,那麼此時不管是使用 Ctrl+c,Ctrl+c,或 Ctrl+c,a ,仍是 Ctrl+c,A ,終止的都是在遠端啓動的那個初始 shell ,所以並不會致使目標進程退出;而此時獲取到的 erl_crash.dump 文件固然也就不是目標進程對應的崩潰文件;
  • 經過 -remsh 登陸後執行 erlang:halt("abort"). 命令,會令目標進程(ERTS)暴力退出,並以 "abort" 字符串做爲 Slogan 生成 erl_crash.dump 文件。由於是基於目標進程信息生成的崩潰文件,所以必然比上面終止初始 shell 進程時生成的崩潰文件內容大;
  • 經過 SIGUSR1 令目標進程退出,並生成 erl_crash.dump 文件的方式也是能夠的。


結論:

  1. Ctrl+c,Ctrl+c 和 Ctrl+c,a 什麼都不會生成,即便是基於 console 啓動程序時;
  2. Ctrl+c,A 能夠生成 erl_crash.dump 和 core.xxx (要放開 ulimit -c)
  3. erlang:halt("abort"). 只會生成 erl_crash.dump (即便放開 unlimit -c);
  4. erlang:halt(abort). 只會生成 core.xxx (要放開 unlimit -c)
  5. 經過 SIGUSR1 終止 erlang 進程,能夠生成 erl_crash.dump 和 core.xxx (要放開 ulimit -c)
相關文章
相關標籤/搜索