「 2009年05月 」一覧

C++/CLIでの実行時エラー

C++/CLIとC++ネイティブのlibをリンクさせて、Windowsフォームアプリケーションを作ったときに、
よくわからないエラーが発生してしまうことがある。

どうやらCRT初期化の順序に問題があるのか。
これを解決するには、エントリポイントの修正を行えば解決する模様。
次のエントリポイントに設定させてあげれば問題解決できた。

ずいぶんと前にわかっていて、日記に書いたと思ったのに忘れていたので、
今更ながら追加。

上記の発生条件

どうやらグローバルなコンストラクタが実行されるときに何かがあるらしい。
C++のclassメンバにstaticなデータがある場合に発生する。
また、それが組み込み型(プリミティブ型)ならば問題なく動くが、
自分で作成したクラス型だと実行時エラーの引き金となる。

追記1

コンストラクタやデストラクタを備えるクラスだとアウトっぽい。
そのクラスがプリミティブ型しか保持していないとしても。

追記2

どうやらコンストラクタがあることが問題ではないらしい。
デストラクタがあることが問題のようだ.
デストラクタのあるクラス型で、クラスstaticメンバを持つと、このエラーが発生する。

こういったクラス構造をどこかで持ってしまうと、C++/CLIで実行時エラーとなる.


WindowsServer2003R2

自分のWindowsServer2003R2の設定で、いろいろ困ったときに参考にしました。
DHCP, DNS, ActiveDirectoryまで説明されているため助かりました。

http://journal.mycom.co.jp/series/server/menu.html

メモがてら、ここに載せておきます。


メモリ不足チェック

Linuxのメモリ状況について。
freeコマンドの実行結果で次のように表示されて、メモリ足りないじゃん!と疑ってみた。

1単位は1kのはずなので今の状況では 3Mほどの空きしかないってこと?
メモリ増やさないとまずいのか?と

どうやらそういうことではないらしい。
各プロセスにメモリを割り当てた後、残っている部分をバッファとキャッシュに利用して
ディスクIOを減らす、ということをOSがやっているようだ。

よって、この場合空きメモリとしてカウントできるのは、
free + buffers + cached の合計値、となる。

でもSwap領域を使っているように見えるが・・・

さらにこのbuffers,cachedで使っている部分も使用頻度に応じてswapへ書き出されることがある。
これがswap使用の理由となっている。

swapの使用状況を見るために vmstat コマンドを利用する.

vmstat 30

として経過を眺める。si,soの項目をみてみる。

  • siの項目がある程度動くのは問題なし
  • soの項目が頻繁に動くのはメモリ不足の疑いあり

ということらしい。

XenServer使っていて、各仮想マシンの状況をチェックするために調べてみました。