Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...
_ artonさんががんばっておられるようですが、MSVCR80.dllは、本来単にエラー終了すべきところで容赦なくデバッガに落ちるようです。
_ というか、リリース版でデバッガに落ちるコードがあるわけがないのでつまりMicrosoftが間違えてデバッグビルドをリリース版として出してるんじゃないかとか思ったり思わなかったりしてるところでやる気がなくなってます...
_ includeの順番ですが、できれば放っておかないで下さい。
yarvだけじゃなくて、1.9でもコンパイル通らないですー。
_ あと、extconf.rbに、have_library
して必須ライブラリが見つからなかったらcreate_makefile
しない、という変更も希望。
_ APIドキュメントってこれですかね?
これを見る限りでは、_get_osfhandle()
は引数fd
がおかしかったらエラーを返すべきでクラッシュするべきではないように思えます。実際、VC++7.1まではそう動作するんだし。
_ 以上の前提を踏まえてcrtのソース(osfinfo.c)を見てみましょう。
実際はVC++8でも(VC++7.1までとソースの書き方は異なりますが)、単にエラーを返すように書かれているように見えます。マクロ_VALIDATE_CLEAR_OSSERR_RETURN
がその部分です。
で、このマクロの中身(internal.h)を見ると、さらにその中でマクロ_ASSERT_EXPR
とマクロ_INVALID_PARAMETER
が使われています。
_ 前者の中身(crtdbg.h)を見ると、_DEBUG
を定義せずにコンパイルすれば何もしないけれど、定義してあると_CrtDbgReportW()
を呼び出してデバッガに落ちることになっています。
_ また、後者の中身(internal.h)は、_DEBUG
を定義せずにコンパイルすれば適当な引数で_invalid_parameter()
を、定義してあればちゃんとした引数で_invalid_parameter()
を呼び出すことがわかります。
で、この_invalid_parameter()
の中身を追うのが非常に面倒なのですが、私の見た限りでは、ユーザーが必要なフックを設定しない限り何もしないように見えます。
_ 以上から、ランタイムが_DEBUG
を定義してコンパイルされていない限り、_get_osfhandle()
はデバッガに落ちないはずだということがわかりました。
というわけで、現在見えている現象から類推するに、我々が使わさせられているMSVCR80.dllは_DEBUG
を定義してコンパイルされた、ということがわかります。
これを確認する最も手っ取り早い方法は、MSVCR80.dllがWin32 APIのDebugBreak()
をインポートしているかどうか確認することです。
実際、VS2005配布物中のMSVCR80.dllはDebugBreak()
をインポートしています。
私はたまたまVS2005配布物でない、ちょっと古いバージョンのMSVCR80.dllも持っているのですが、それは_DEBUG
を定義せずにコンパイルされたものらしく、DebugBreak()
はインポートしていませんし、当然、以上のような問題は起きません。
_ 結論としては、私は、MSが間違えて_DEBUG
を定義してコンパイルしてしまったMSVCR80.dllを配布してしまったのではないかと考えています。
間違えじゃなくて今後はこういう仕様なのかなあ。だったらイヤスギ。
と、いうのが、昨日のやる気がなくなってる理由です。
_ すると、_INVALID_PARAMETER
の方にひっかかってるはずである、という話になるんですね。それならそれで納得はできます。
_set_invalid_parameter_handler()
を呼んでおくだけですからね。
でも、私が試したときは、その前の_ASSERT_EXPR
に引っかかったような気がしてるわけで、そこが気になってるのです。記憶違いかなあ。
Index: win32/win32.c =================================================================== RCS file: /home/cvs/ruby/win32/win32.c,v retrieving revision 1.185 diff -u -1 -p -r1.185 win32.c --- win32/win32.c 14 Feb 2006 04:49:01 -0000 1.185 +++ win32/win32.c 23 Feb 2006 09:50:33 -0000 @@ -412,2 +412,9 @@ static void init_stdhandle(void); +#if _MSC_VER >= 1400 +static void invalid_parameter(const wchar_t *expr, const wchar_t *func, const wchar_t *file, unsigned int line, uintptr_t dummy) +{ + // nothing to do +} +#endif + // @@ -422,2 +429,6 @@ NtInitialize(int *argc, char ***argv) +#if _MSC_VER >= 1400 + _set_invalid_parameter_handler(invalid_parameter); +#endif + //
_ あら、さくっとnmake -l test-allが通るね(いや、Eとかは出るけど)。
_ 結論としては、私間違い、artonさん正しいということで。
お騒がせしました。
_ 1.8で、外部ライブラリが絡むもの以外は0E0Fになった。
我ながらびっくりだけど、とりあえずcommitしておく。
_ registry.rbの問題はこちらでは何も起きてないのでさっぱりわからないまま。
_ ううむ、そもそもmswin32では1.8ではtest-allはサポートしてないので(だいたい動くけど)、runner.rb直打ちなんですよねえ、うちでも。
なんかの拍子に直るか現象が隠れるかしたか、環境依存なのか、謎です。
被捕捉アンテナ類
[\ay antenna (testing)]
[Ant]
[Antenna-Julia]
[LayserあんてなV2]
[nAntenna]
[nuance de Antenna]
[Rabbit's Antenna]
[Read List]
[Ruby hotlinks 五月雨版 (るるりん。)]
[してたま (私的アンテナ with たまてばこ)]
[ただのあんてな]
[ちゃらんぽらん]
[でこぽんリンク]
[なよろアンテナ]
[にっきトレーサー]
[偽善者あんてな - 2nd season -]
[湘南日記放送局(SDB)]
[はてなの各アンテナ]