Visual StudioでWindowsのDLLのデバッグ方法をC言語/C++で作成したソースコードを使って実例付きで詳しく解説します。
文字だけだと分かりにくいので、Visual Studioの画像を多めに使って紹介します。
DLLのデバッグは、以下の3パターンの方法でほとんどのケースで対応できます。
a)呼び出し元プログラムのプロジェクトとDLLプロジェクトを同時にデバッグ
b)DLLプロジェクトのプロパティで呼び出し元のアプリを指定して、デバッグ
c)「プロセスにアタッチ」機能を使って、アプリから呼び出されるDLLをデバッグ
この記事の内容(プロセスにアタッチする方法)を動画で紹介しています。
DLLのビルド方法については以下の記事を参照ください。
デバッグ方法
以下の3パターンを説明します。
a)呼び出し元プログラムのプロジェクトとDLLプロジェクトを同時にデバッグ
b)DLLプロジェクトのプロパティで呼び出し元のアプリを指定して、デバッグ
c)「プロセスにアタッチ」機能を使って、アプリから呼び出されるDLLをデバッグ
呼び出し元プログラムと同時にDLLをデバッグ
呼び出し元プログラムのプロジェクトとDLLのプロジェクトの作成方法をプログと動画で紹介しています。
Visual Studioのソリューションに呼び出し元プログラムのプロジェクトとDLLのプロジェクトが含まれる場合は、そのままデバッグ可能です。
上記の記事で紹介した「DLLの作成手順」のようにソリューションとプロジェクトを作成して一体型となっている場合は、DLL側にブレイクポイントを設定して、「デバッグの開始」または「F5キー」でデバッグできます。
DLLプロジェクトから呼び出し元プログラムを指定
DLLのプロジェクトしかない場合、DLLプロジェクトのプロパティで呼び出し元のプログラムを指定します。
[ソリューション エクスプローラー]でDLLプロジェクトを選択し、右クリックして[プロパティ]を選択。
次に、[デバッグ]タブを選択し、[コマンド]フィールドで「参照」で呼び出し元のプログラムを選択します。
最後に、[OK]ボタンをクリックして変更を保存します 。
これで、DLLプロジェクトから[F5]キーを押してデバッグを開始できます
プロセスにアタッチ
[プロセスにアタッチ] 機能を使って、別のプログラムから実行されるDLLをデバッグする方法を紹介します。
常駐型のプロセスや、すでに実行中のプロセスをデバッグする場合に便利です。
下の図のようなファイル構成で実行可能ファイル(DLLTest.exe)からDLLファイルが呼び出される場合、DLLTest.exeにアタッチします。
メニュー「デバッグ(D)」-「プロセスにアタッチ(P)」をクリック。
ブレイクポイントを設定しておくと、関数が呼び出されると停止します。
プロセスにアタッチ方法でデバッグできない場合の確認ポイント
プロセスにアタッチ方法でデバッグできない場合の確認方法を紹介します。
リンクされているDLLを確認
呼び出し元プログラムが、DLLのDebug版とリンクされている必要があります。
呼び出し元がRelease版で、DLL側がDebug版でもリンク可能です。
呼び出し元がRelease版で、DLL側もRelease版の場合、デバッグできません。
どこのDLLがロードされているかを確認
プロセスにアタッチしても呼び出し元のプログラム(.exe)が、どこのディレクトリのDLLファイルを読んでいるかが分からないことがあります。
デバッグ対象のDLLがロードされているかを確認する必要があります。
Windowsのプログラムは、DLLファイルを探すディレクトリの順番が決まっています。
一番確実な方法は、呼び出し元のプログラム(.exe)と同じディレクトリにDLLファイルを置くことです。
同じディレクトリのDLLが一番最初にロードされます。
PDBファイル(拡張子が.pdb)も忘れずにコピーしましょう。このPDBファイルにデバッグ情報が含まれています。
以下のように同じディレクトリに配置します。
Windowsプログラムがファイルを探すディレクトリ順
WindowsのプログラムがDLLファイルを探すディレクトリの順序は、次のようになります。
1.実行ファイルのディレクトリ (.exe ファイルが存在するディレクトリ):
実行中のプログラムが配置されているディレクトリが最初に検索されます。このディレクトリにDLLファイルが見つからない場合、他のディレクトリが順番に検索されます。
2.カレントディレクトリ:
実行中のプログラムのカレントディレクトリが次に検索されます。通常、プログラムが開始されたディレクトリがカレントディレクトリになります。
3.システムディレクトリ (System32 フォルダ):
Windowsシステムディレクトリ(通常は C:\Windows\System32)が検索されます。このディレクトリには、Windowsの基本的なシステムファイルが含まれています。
4.Windowsディレクトリ (Windows フォルダ):
Windowsディレクトリ(通常は C:\Windows)も検索されます。これもシステムファイルが格納されている場所です。
5.環境変数PATHで指定されたディレクトリ:
環境変数PATHに指定されたディレクトリが順番に検索されます。PATHに含まれるディレクトリは、システム全体で共有される場所であり、様々なプログラムが利用できる共通の場所です。
DLLの検索順序は、これらのステップに従って行われ、最初に見つかったDLLが使用されます。
ただし、セキュリティの理由から、システムディレクトリやWindowsディレクトリに直接DLLを配置することは避け、適切な方法でDLLを配置し、PATH環境変数を適切に管理することが推奨されます。
今回のサンプルプログラム
説明に使用したVisual Studio 2022のソリューションファイル一式をダウンロード可能にしておきます。学習用にご利用ください。
(大したプログラムではないです。著作権はありません。(^^♪) )
ヘッダーファイルとライブラリファイルの指定がフルパスになっているので、適当に変更してください。
【DLL-build.zip】ファイルサイズ(10KB)
C:\src\Dll-build に解凍し、DLLtest.slnを Visual Studioで開くとそのまま利用可能です。
最後に(Windows VPSを紹介)
公式サイトの情報は、文字ばかりで理解することが難しいですね。今回、画面のスクショを多くして解説しました。
最後にWindowsの開発者が知っているとお得なことを紹介します。
クラウド上のWindows Serverがリーズナブルな価格で即日利用可能なVPSサービスが存在します。動作検証などで1ヶ月だけの利用などの用途にも使えます。
物理サーバマシンを手配したことがある方は分かりますが。
物理サーバを用意する場合は、メーカーにサーバマシンの見積りを取って、手配をして搬入して設置し、Windowsをインストールしてネットワークなどを設定してやっと使えるようになります。(どんなに早くても週単位で時間がかかります)
「ConoHa」と「さくらVPS」では、契約アカウントの作成からWindows Serverが使えるまで、30分かかりません。
(他の会社のVPSは、次の営業日だったりと開始まで時間がかかります。)
ConoHa の VPSは時間課金をサポートしているので、2、3日だけ使うという用途でも利用可能です。(4時間だけという使い方もできます)
私は記事を書くための調査や動作確認にConoHaのVPSを使っています。ローカルのPCにいろいろソフトをインストールするとWindowsが不調になるので。