OSS Consortium


 

日本語 | English

開発基盤部会 Blog

開発基盤部会 Blog >> Article details

2020/07/17

兼務でブラックボックスなプロダクトのサポートをする場合の話

Tweet ThisSend to Facebook | by nishino
 まぁ、タイトルのブラックボックスなプロダクトって、Windowsの事なんですが、先日、「ReadFileを行うとGetLastError()=121が発生する。」みたいな話があって、私としては(、ブラックボックスなプロダクトの内部仕様に関する話なので)、早々に提供元ベンダ(要するにM$さん)のサポートに行くだろうなぁ。と思って見てました。

 ...と言うのも、コレ系、サポート行かないと正確なこと言え無いですから。とは言え、「Advanced Windows 改訂第4版」を、当時、一万円で自費購入し、まぁ、読破した事がある位の知識量はあるので、今回は、もうチョット細部に言及して、なんで、早々にベンダのサポートに行った方が良いのか?納得できるような形にしてみようと思います。

 そもそも、121 (0x79)って、ERROR_SEM_TIMEOUT (The semaphore timeout period has expired.)らしいんですよね。semaphoreとは、スレッド同期ツールキットのカーネル・オブジェクトですね。ググると、このエラーが、ReadFileを使う、様々な箇所で発生するらしいです。

 ちなみに、semaphoreの使い方は以下で、


 WaitForSingleObjectで待機します。

 そこで、WaitForSingleObjectの説明を見ると、基本的なエラーコードにWAIT_TIMEOUTというのがあるので、ERROR_SEM_TIMEOUTは、WaitForSingleObject側で出しているエラーでは無さそうだ。と言う事が解ります。

 なので、ReadFile側でWaitForSingleObjectを使用していて、ここで、WAIT_TIMEOUTが返った時に、ERROR_SEM_TIMEOUTのエラーコードを設定しているんだろう。...と言う事が想像できますね(ソースコードを読んだ訳では無いので正確なことは解りませんが)。しかし、解るのは、所詮、ココ迄で、「もう少し、知りたい。」と言われても、「Process Monitor等を使用して、デバッグしてみたら、何か解るかも知れません。」...位です。

 余談ですが、前述の「Advanced Windows 改訂第4版」も、中の人が書いた書籍ではないので、様々な、カーネル・オブジェクトの仕様の掘り下げのタメに、沢山のサンプル・コードを持って、様々な検証を行っているんですね。...とは言え、やってる範囲は、正常系なので、異常系になってくると、外部仕様から推測すると言うアプローチではチョット難しくなってくると思います(内部仕様やデバッガが必要になって来る)。

 ...と言うことで、このようなケースでは、

 「コードレベルで解るし、内部のKB検索や、適切なデバッグツール(、例えば semaphore を release しないスレッドを調査するとか)、への誘導等をしてくれるだろう、ベンダ・サポートに、早々に問い合わせるのが良いのではないか?」

 等と思う次第であります。
18:00 | Impressed! | Voted(0) | Comment(0) | ご報告