「 2011年06月 」一覧

NULL 参照ポインターがスタブに渡されました


Windows7にしてからの挙動変化

DirectX関連のプログラムを作っていて、
「testApplication.exe の 0x776ab727 で初回の例外が発生しました: 0x000006F4: NULL 参照ポインターがスタブに渡されました。」
というメッセージを、VisualStudioの出力ウィンドウで見かけるようになりました。
それとアプリケーションの終了時に、ヒープが壊れています(下図)のメッセージが出てきたりとか。

アプリケーションの組み方にちょっと気をつけないといけないのでは?と思います。

またこのメッセージの発生条件については、ネットを調べてみてもいまいち理由が不明だったので、気合いを出して調べてみました。

発生環境

  • Windows7 x64 Ultimate, Professional
  • VisualStudio2010,2008どちらのビルド環境でも起こる
  • DirectX(DirectSoundやXAudio2使っていたりするとより出くわす)
  • Microsoft Office IME 2007を使用

発生する環境として上記を満たしていることが条件です。

原因

調べてみてわかったのは上記の環境で以下の2つを同時に満たす場合に発生しました。

  • Microsoft Office IME 2007を使用している
  • CoInitialize,CoUninitializeの呼出タイミングが悪い

どうやら ShowWindow関数を実行して、CoInitialize関数が実行されると、
「0x000006F4: NULL 参照ポインターがスタブに渡されました。」のエラーが発生します。
ShowWindow関数の前に CoInitialize関数を(1度は)実行しておく必要があります。
初回実行がShowWindowより後だとまずいってことです。

そして、それに対になるCoUninitialize関数もまた、同じようにDestroyWindow関数の後に実行する必要があります。
これも逆になると、ヒープが壊れています、のエラーを発生させる条件となります。

さらに、IMEの存在が上記の発生条件にかかわってきます。
これがATOKを普段使用している環境だと上記のエラーが発生しないようです。

対処方法

理由のところでしっかり書いてしまいましたが、
プログラム中で以下の手順を守ることで、Windows7上でもエラーを出さないプログラムにできます。

  1. main関数(WinMain)入った早々に CoInitialize関数を呼び出す
  2. ウィンドウを生成する。(ウィンドウハンドル有効)
  3. ウィンドウハンドルを必要とするモジュールの準備
    1. DirectX GraphicsやDirectSound, XAudio2など
  4. ShowWindow関数を実行
  5. (定常状態)
  6. 終了処理をした後、DestroyWindow関数を実行
  7. CoUninitialize関数を実行
  8. プログラム終了

Windows7で問題を発見、解決策の模索を行いましたが、
Windowsカーネルのバージョンを考えると、これらの問題発生はWindows Vistaでも同様に起こることが予想されます。

まとめ

エラーが発生する人としない人の環境差として、IMEが絡んでいるところまでは突き止められましたが、まだ他の要因もあるのかもしれません。
発生しない人はMicrosoft IMEを使っていなかった、となると、使っていないユーザーはそんなに多いのかって疑問にもなります。
もしかしたら、IME2007だけが悪いのかもしれませんし…。


KVMでデバイスパススルー その4


PT2で実験中

PX-W3PEで仮想マシン内録画でさんざんな結果でしたが、
PT2ではどうなんだろうとおもってテストしてみました。
今までの環境構築テストで、録画自体はスクランブル解除なしでうまくいっていたというところまで確認は出来ていました。

結果

PT2の場合は、CPU使用率は低く抑えられた。
ピークで20%も使わないくらい。
W録画時にもこのような状況で、パケットのドロップは発生しなかった。

こういう状況なので、この仮想マシンにBCASカードリーダーを接続させ、
スクランブル解除までやらせてみた。
その結果もまた優秀でW録画時かつデコードありで、
CPU使用率は相変わらず低いままであった。

まとめるとPT2のほうが機器として良くできているということじゃないかと思う。
仮想マシンで録画ということを考えると、PT2は使える!ということになると思う。


KVMでデバイスパススルー その3


途中報告

確かにFedora14の環境下でKVM(0.13)を使うと、
デバイスパススルーの機能を用いて仮想マシン内で録画を行うことが出来た。

  • PT2
  • PX-W3PE

上記の2ボードで試してみたが、どちらでもひとまず録画が出来ることが確認できた。
すばらしい・・・。

ただ現時点では安定動作出来るかどうかは確認できていない

実験中1 (PX-W3PE)

PX-W3PEのほうが情報が少ないので、ネットに晒してみます。
どうも仮想マシン内で録画の際にCPU使用率が高い。
シングル録画時で30~50%ほど。W録画中では75~80%ほど。

しかもこれはスクランブルのデコードをしない状態でである。

スクランブルのデコードをした場合にはまず確実にドロップが発生する。

一応PX-W3PEのドライバ設定で、レジストリを変更しています。
・自動ゲインコントロール(ブースタ)
・内部ブースターの値は適当に0x0aあたり

このような状況のため、このボードの仮想マシン内録画は
デコードなし、シングル録画限定、
という制限を設けて使うのが精一杯かもしれない。

BonCasLink

別環境に用意したBCasLinkServiceに接続して、デコード処理をやらせる感じにしたらブルースクリーンが出たり、ドロップ多発したり色々発生した。

現時点の状態では、使用しない方が賢明。

W録画

どうにも安定して長時間録画できない。
シングル録画のみの使用に限定した方がいいかも。


ThinkPadでESXi 4.1を動かす


購入したばかりのThinkPad T420ですが、
早速VMware vSphere Hypervisor(ESXi 4.1)を使えるかどうかを確認してみました。

インストールディスクからインストールを試みる

VMwareのサイトからダウンロードできるisoイメージをCD-Rに焼いて、
インストールを試みてみました。

しかしながら、VMFSのモジュールを読み込んだあたりでロード失敗、
その後インストール処理を出来ないという状態になりました。

よって、USBメモリにESXiシステムを入れて試してみます。

USBメモリに本体を入れる

過去の日記 の”ESXiをUSBメモリに展開”の項と同じことをします。
imagedd.bz2を展開して、それをDD for Windowsを用いて書き込むだけです。

内蔵NICを認識させる

幸いにしてT420の有線内蔵NICはIntelの82579LMでした。
これはモジュールを置き換えることでESXiで使用可能です。

基本的には 過去の日記にもあるように、
USBメモリ内のモジュールデータを使用するNICに対応したものに置き換える作業をします。

VMware PlayerでCentOSをいれた仮想マシンを用意します。
そして、ESXiインストール済みUSBメモリをそのCentOS仮想マシンからマウントします。

http://www.vm-help.com/forum/viewtopic.php?f=12&t=2194&p=11181#p11181

上記のURLからoem.part1.rar, oem.part2.rarをダウンロードし、
oem.tgzを取り出します。

そして、CentOS側でHypervisor1として見えている領域の中にあるoem.tgz を
今展開したoem.tgzで置き換えます。

(VMwareToolsが入っている環境だと、Windows側からファイルをD&Dしてコピーできます)

こうやって作ったUSBメモリからESXiを起動させるとネットワークも使用可能となります。

まとめ

ノートPCにESXiを入れるという記事は、最近のものではあまり見かけませんでした。
今回自分がノートPCを購入する際にこの情報を検索して困ったので、日記にしてみました。
2011/06/02現在で購入できたThinkPad T420ではESXiを動作させることが出来ました。

また、心配していた内蔵HDDも認識できたので、
このノートPC単独でESXiサーバー運用ができそうです。

さすがThinkPadといったところでしょうか。

その他

内蔵HDDにシステム本体もインストールすることについては、
深追いしていないです。もしかするとAHCIのモードを変更することで、
インストールも普通に出来るようになるのかもしれません。

それとvt-dを有効化したので、デバイスパススルーもできるようでした。
ただ実際にパススルーして運用できそうな物は、USB2とAudioとの2つくらいかと思われます。
内蔵NICはパススルーしてしまったら操作不能になってしまうので。


ThinkPadデビュー


ノートPCは今まで数回買ったことがあるのですが、今回初めてThinkPadを買いました。
今回購入したのはSandybridge搭載のT420というやつです。
到着したばかりですがざっとみて個人的に、良かった点をあげてみます。

良かった点

個人的に良かった点をあげておきます。
もともとESXi(VMware vSphere Hypervisor)を動かしたいな、という淡い希望があったので、それに関するところが高ポイントです。

  • 有線LANが 82579LM だった。
    • oem.tgzの適切な交換で、ESXiで使えそう。
  • NVIDIA Optimusテクノロジー搭載
  • BIOSで、VT-dのON/OFF項目があった
    • ノートPCでIntel VT-dが使えるってこと

グラフィックス系でプログラムを書いてみたりしているので、
NVIDIA Optimusテクノロジーが入っていることは結構楽しみですね。
また、ノートPCでIntel VT-d(IOMMU)が使えるって点はかなりすごいかと。
ただデバイスパススルーするデバイスが自在に取り付けられないのでノートでのメリットはデスクトップに比べ低そうではありますが・・・。

悪かった点

  • 標準でIntel VT-xがDisable

もうそろそろ仮想化支援はデフォルトでONにしておいてほしい今日この頃です。