スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Fatal Stack を見てみる

2009年04月06日 00:10

クラッシュやハングアップをした場合にサポートが最もよく見るのはコールスタック情報です。
残念ながらコールスタック上で表示される関数のインターフェースや仕様などについては公開されている情報はほとんどありませんが、既存情報との照合や動作の概要などを把握したり、有益な情報が得られる事も少なくありません。
 今日はNSDで最も特徴的とも言えるコールスタック情報とFatal Stackについての概要を説明しようと思います。

■ コールスタックとは
NSDでは、全ての Lotus Notes/Domino のプロセス、全てのスレッドでの関数の呼び出し履歴をコールスタック情報として出力します。
その他のセクションではプラットフォーム毎に多少の差異がありますが、どのNSD も何らかの形でコールスタック情報を持っています。
NSD取得時のコールスタックを確認する事によって、情報取得時の各関数の呼び出し順序などの情報を確認する事が出来ます。
NSDでは通常呼び出し順序は下から上になります。(System i だけは例外で上から下の呼び出し順序になります)
以下のようなコールスタックがあったときには、FunctionA()がFunctionB() を呼び出した事を示しています。

-> FunctionC()
-> FunctionB()
-> FunctionA()

つまり、上記のコールスタックは以下のような呼び出しが行われたことを示しています。
FunctionA() {
.....
FunctionB();
.....
}

FunctionB() {
.....
FunctionC();
.....
}

この辺は改めて書くまでも無いかもしれないですね。。。
NSDやNotesに限らず、Javaをはじめとする、C/C++ 等のクラッシュダンプ情報でも同様なので、よく知っている方も多いのではないかと思います。

■ Fatal Threadとは?
サーバーやクライアントがクラッシュした際に例外が発生したスレッドの事を、Fatal Threadと呼びます。 NSD内のFatal Thread を実際に見てみましょう。

WindowsのNSDでは以下の赤字のような「Fatal Thread」と言う文字が入るので比較的簡単に探す事が出来ます。

Fatal Thread の出力
############################################################
### thread 1/25: [ ntvdm: 0a74: 0cd8] FATAL THREAD
### FP=0013b260, PC=7c94eb94, SP=0013b1fc
### stkbase=00140000, total stksize=212992, used stksize=19972
############################################################
[ 1] 0x7c94eb94 ntdll.KiFastSystemCallRet+0 (b10,493e0,0,13b7e4)
[ 2] 0x7c802532 kernel32.WaitForSingleObject+18 (b10,493e0,3,13ba00)
@[ 3] 0x60193f25 nnotes.OSRunExternalScript@8+1269 (12c,1,1,0)
@[ 4] 0x601943ba nnotes.FRTerminateWindowsResources+986 (1,0,1010,1)
@[ 5] 0x6019477f nnotes.OSFaultCleanupExt@24+895 (1284bd0,1010,0,0)
@[ 6] 0x6019480a nnotes.OSFaultCleanup@12+26 (0,1010,0,10ec8d0f)
@[ 7] 0x601a0624 nnotes.OSNTUnhandledExceptionFilter@4+276 (13cd60,2b3,54200a0a,61657268)
@[ 8] 0x60178551 nnotes.Panic@4+481 (60b82d3b,10ec8d10,13cd8c,60008c62)
@[ 9] 0x601785cc nnotes.Halt@4+28 (2b3,10ec8d10,13cdc8,13cda4)
@[10] 0x60008c62 nnotes.HANDLEDereference@4+50 (10ec8d10,0,13db6c,0)
@[11] 0x60008b92 nnotes.InitDbContextExt@12+210 (10ec8d10,13cdc8,3,13cdfc)
@[12] 0x60008cd2 nnotes.InitDbContext@8+18 (10ec8d10,13cdc8,1864e63,e2)
@[13] 0x60015103 nnotes.NSFDbPathGet@12+19 (10ec8d10,13d31c,0,127)
@[14] 0x6002f2e1 nnotes.NSFCreateNotesURL@8+129 (13db3c,13dbd0,13dc90,11c9ee14)
@[15] 0x61d0cfdf nnotesws.DeskViewExporter::GetLinkNotesURL+543 (13dc90,f,c606fa0,13e7b8)
@[16] 0x6206a640 nnotesws.LinkExporter::ExportFormatData+112 (f,13dc8c,f,c606fa0)
@[17] 0x6180203a nnotesws.OLEDataTransfer::GetData+106 (c606fa0,13e7b8,13e7ec,9344914)
@[18] 0x618208d4 nnotesws.OLEDataImporter::ExportFormatData+180 (f,13e824,26c,9344918)
@[19] 0x61e03103 nnotesws.ViewDropTarget::Drop+67 (9344930,26c,2b1,1)
@[20] 0x61800d32 nnotesws.CNEMDropTarget2::OSDropTarget::Drop+114 (62140ed0,c606fa0,0,26c)


Windows 以外ではこのような表示が無いのですが、その場合には以下のようなキーワードを含むコールスタックに着目してください

Windows
Fatal, Panic, Halt, access violationなど

UNIX
“fatal”, “raise.raise”, “signal handler”, “abort”, or “terminate” など

多くの場合、Windows ではPanic()または Halt()、UNIX系ではfatal_error() がFatal Thread では呼ばれているはずなのですが、色々なケースがあるので柔軟に探してください。。


■ 関数名の表示
 実はこの表示はプラットフォーム毎に違うのですが、以下の例を見てみましょう。

@[10] 0x60008c62 nnotes.HANDLEDereference@4+50 (10ec8d10,0,13db6c,0)

これは、nnotes.dll のHANDLEDereference() と言う関数が呼ばれた、と言う意味です。
nlnotes.xxxxx であれば、当然nlnotes.exe の関数になるので必ずしも隠れている拡張子はdll とは限らないのですが、DLLかEXEだと思っていれば間違いないでしょう。

頭についている"@"は Windows NSD固有の機能なのですが、NotesのDLLから呼ばれた関数である事を示しています。nnotes.dllがNotesのプログラムディレクトリにあるので、そこから判断しています。
何気ない一行でも案外色々な意味があったりするのです。


技術情報の検索
上記のようにした、クラッシュでは、Fatal Threadにある関数名からナレッジベースを検索していきます。
 出来るだけ上の関数を取るのが普通ですが、上の例で言えばHalt()から上は通常のException Handlingなので検索には使用しません。なので、上のFatal Threadで太字にした部分などを検索に使用します。(ここではやり方だけを説明しているので、上の関数名による検索で適切な技術文書がヒットするかしないかはこの際重要ではありません。)
 
 技術文書がヒットしない事もよくあると思いますが、クラッシュが複数回発生した場合などは、このようにして発生したクラッシュを分類する事が出来るようになるはずです。

・ 同じタスク・同じコールスタックで発生
・ 異なるタスクだがほぼ同じコールスタックで発生している
・ 必ずしも同じとは言えないがよく似たコールスタックで発生している

自分の端末でクライアントが頻繁にクラッシュするときなどにちょっとIBM_TECHNICAL_SUPPORTディレクトリに出来たNSDを眺めてみてください。

以前にこのブログで紹介したLotus Notes Diagnostics UtilityなどではNSDを見て技術情報を簡易に検索してくれますが、このような方法を使っているはずです。


コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://hnagasim.blog8.fc2.com/tb.php/124-8701bb92
    この記事へのトラックバック


    最新記事


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。