VC9

VC2008ExpressEditionを使ってみてSTLのコンテナやstringの変数の表示ができるのかあ、
って感動していたらVC8からできてたんですね(http://d.hatena.ne.jp/NyaRuRu/20050406/p3)。

激しく取り残されているなあ、仕事ではいまだにもっと古いバージョンのVCを使っているもので...

でも、STLPortSTLは便利に表示してくれないんだろうなあ。

ハンドルリーク

ハンドルリークしていたとき、どんなハンドルがリークしたのかお手軽に調べたいなと。

windbg使っていれば
!htrace -enable
しておいて、アプリケーションを操作してハンドルが増えたところで、ブレークして
!htrace -diff
とするとハンドルとそのハンドルが作られたコールスタックが表示される。
ヘルプには
!htrace -enable [Max_Traces]
と書いてあるけれど、WindowsXPでは記録されるコールスタックの深さが変えられないみたい。

もうひとつはProcessExplorerでCtrl+LでShow Lower PaneしてCtrl+Hでハンドルを表示させておいて、Ctrl+Aでファイルに保存。アプリケーションを操作してハンドルが増えたら、もう一度別のファイルに保存して、その二つのファイルをdiffするのもいいかな。

kernrate

http://blogs.technet.com/markrussinovich/archive/2008/04/07/3031251.aspxにも少しだけ書かれているけど、自分もkernrateはアプリケーションの性能調査で使います。

pid=1234を10秒測定するには
kernrate -s 10 -p 1234 -z ntdll
とか、5秒まってから測定開始したいときは
kernrate -w 5 -s 10 -p 1234
みたいに。

自分で作ったdllのpdbを用意して
kernrate -s 10 -p 1234 -z mydll -j pdbpath
とすれば、mydllで実行されたコードのより詳細な情報を出してくれる。
pdbがあればエクスポートされていない関数でのプロファイルも出してくれる。

kernrateはオプションが多くて全部把握できていないけど、あとは-rや-vあたりを使えばいまのところ自分の仕事には十分使えてます。

例外

WindowsXPでベクタ例外を試してみようと思ってAddVectoredExceptionHandlerのハンドラを書いて登録した。適当なアクセス違反を起こすコードと、ハンドラが動いたことをみるためにハンドラにはOutputDebugStringを書いて試してみた。
で、ハマった。例外ハンドラが動かず突然プロセスが終了してしまう...デバッガでアタッチして実行するとうまく動く。


http://www.ddj.com/windows/184416750
なるほど...ベクタ例外ハンドラにOutputDebugStringは書いてはいけないような気がする。それを消したら問題なく動いた、ふーん。

...とはじめて日記書いてみた