[HOWTO] UMDH を用いたメモリリーク調査技法

Platform SDK (Windows SDK) サポートの平田です。私は、元 ADSI/ILM/FIM を担当しておりました。ひょっとするとhttp://blogs.technet.com/b/jpilmblg をご覧になられた方がいらっしゃるかもしれません。ぴろととして記事を書いておりましたが、今後は SDK サポートの平田として鋭意皆様のお役に立てればと考えております。 ところで先日、調布にあるオフィス近くのビアガーデンに行ってまいりました。思ったより混んでいたものの、運よく座ることができました。最近暑い日が多いので、外で飲むビールが美味しくて夏を全身で感じることができました。皆様も、水分と塩分をしっかり補給していただいて体調管理には十分お気を付けください。私たちも、気持ちも体もベストコンディションでお客様の問題を解決できるよう、日々体調管理に気を付けてまいります。 汗で水分がリークすると熱中症になるかなぁとか思い立ったので、本日は、メモリ リークに焦点を当てて調査を行う方法についてご紹介いたします。 概要説明多くの場合、アプリケーションのメモリ リーク箇所の特定は非常に難しいトラブルシューティングとなります。しかしながら、本日ご紹介させていただく User-Mode Dump Heap (以下、UMDH) というツールを用いることで、メモリ リークの発生箇所や、リークの大きさを特定することができます。私たちもお客様からのお問い合わせを調査する際に利用しているツールですので、ひょっとしたらメモリ リークしてるかも?という場合にぜひともご利用いただきたいツールです。 UMDH ツールは、Windows SDK に含まれる Debugging Tools for Windows の一部として提供されており、簡単に利用できるのですが、VirtualAlloc() や VirtualAllocEx() で確保されたメモリのメモリ リークは残念ながら検出することができません。その点だけお気を付けいただければ便利に使えるツールです。 ツールのインストール自分のプログラムにメモリ リークが疑われたら、まず、パフォーマンス モニターでメモリに関する情報を採取してみましょう。これには、パフォーマンス モニターの Process カテゴリの情報を採取し、 Private Bytes の値を監視します。この値が右肩上がりの傾向であれば、メモリ リークが発生している可能性あるため、より詳しく調査をするために UMDH の出番となります。 1)   UMDH のインストール方法以下の SDK をダウンロードしてインストールします。この時、[Debugging Tools for Windows]…


WinSock (Windows Sockets) API で IPv4/IPv6 デュアル スタック プログラミングに挑戦!!(TCPクライアント編)

Platform SDK (Windows SDK) サポートの小泉です。みなさま、IPv4 アドレスが枯渇するといった話題が出てから何年も経ちましたが、IPv6 対応は既にお済でしょうか?「まだ IPv4 が使えるし、IPv6 への改修をしたらIPv4 対応しかしていない古いネットワークでは自社アプリケーションが使えなくなってしまう。IPv6 対応はまだ早いかな。。。」と心配されている方!!IPv4 ネットワークにも IPv6 ネットワークにも対応できるWinSockのプログラミング方法があったとしたら如何でしょう?今のうちに対応していれば、エンドユーザ様にも「自社のアプリケーションは、旧来の IPv4 ネットワークにも、最新の IPv6 ネットワークにも両方対応しております。将来、世の中が IPv6 ネットワークに完全移行してもアプリケーションに対する移行コストは 0 です。」と胸を張って言えますね。という事で、今回は「WinSock (Windows Sockets) API で IPv4/IPv6 デュアル スタック プログラミングに挑戦!!」と銘打って、IPv4/IPv6 の両方に対応したプログラミング方法をご紹介いたします。 1.まずはIPv4対応WinSockプログラムのおさらい まずは、一般的な IPv4 対応 WinSock プログラムのおさらいから始めましょう。ほとんどの IPv4 対応WinSockプログラム(クライアント側)は以下のような流れになっているかと思います。以下の例を見てもわかるとおり、IPv4 アドレスを直接指定しており、これでは IPv4 通信しかできませんね。  1)  WSAStartup API でソケットを初期化します例:WSAStartup(MAKEWORD(2, 2), &wsaData); 2)  Socket API で利用する IPv4 アドレスファミリとプロトコルを指定して、ソケットハンドルを作成します例:SOCKET…