DLL と EXE のデバッグ方法


DLL と EXE のデバッグ方法

Author
Message
Zemax_Japan
Zemax_Japan
Forum Member
Forum Member (1K reputation)Forum Member (1K reputation)Forum Member (1K reputation)Forum Member (1K reputation)Forum Member (1K reputation)Forum Member (1K reputation)Forum Member (1K reputation)Forum Member (1K reputation)Forum Member (1K reputation)

Group: Administrators / Zemax Staff
Posts: 257, Visits: 2.8K
概要 : この記事では、ユーザ定義面を使用する場合 (DLL) およびユーザ定義オペランド UDOC を使用する場合 (EXE) に、実行中のプロセスに Visual Studio のデバッガをアタッチする方法について解説します。ここで紹介する手法では Microsoft Visual Studio Express 2013 Desktop を使用します。
DLL または EXE のコンパイル
OpticStudio の起動およびユーザ定義面またはユーザ定義オペランドの選択
プロセスへのアタッチ
ブレークポイントの設定
DLL/EXE の実行
デバッガの停止
リリース モードでの DLL/EXE の頒布
結論

著者 : Michael Humphreys、Sandrine Auriol、Tim Gustafson

公開日 : 2017 年 7 月 11 日

サンプル ファイル :

対象 : OpticStudio / ZOS-API.NET / Zemax のプログラミング



手順の解説

この手順は、ユーザ定義面 (C++ を使用) およびユーザ定義オペランド (C++ または C# を使用) を作成する Visual Studio の C++ または C# のプロジェクトから開始します。
これらのユーザ定義機能の作成手順については、詳しく説明しません。

デバッグ モードでの DLL または EXE のコンパイル

  • 方法 1 :まず、DLL または EXE をデバッグ モードでコンパイルする必要があります。たとえば、下記のスクリーンショットではユーザ定義面 (DLL) をコンパイルしています。

図 1 : デバッグ モード

図 2 : デバッグ出力

コンパイル完了後、DLL と PDB ファイルプロジェクトのデバッグ フォルダから C:\Program Files\Zemax OpticStudio\DLL\Surfaces にコピーする必要があります。

通常は (DLL をリリース モードで使用する場合)、DLL ファイルのみをコピーします。しかし、ここではプログラムのデバッグ情報が保存された PDB (プログラム データベース) ファイルも必要です。


図 3 : DLL と PDB のコピー

ただし、DLL は、OpticStudio で必要とするフォルダには保存されず、ソリューションのデフォルト ビルド フォルダに保存されます。したがって、DLL を変更して再コンパイルした場合は、その都度、手動で DLL と PDB ファイルを上書きコピーする必要があります。
  • 方法 2 : DLL または EXE の出力フォルダを変更します。
もう 1 つの方法では、コンパイル前に DLL または EXE の出力フォルダを "C:\Program Files\Zemax OpticStudio\DLL\...." に変更します。このフォルダに DLL または EXE を正常に保存するには、Visual Studio を管理者権限で実行する必要があります。

http://forum.zemax.com/Uploads/Images/16d924fa-7e61-4ff4-9034-f487.jpg
図 4 : Visual Studio を管理者として実行

管理者権限でソリューションを起動すると、ビルドの出力ディレクトリを変更できます。プロジェクトのプロパティを右クリックして [プロパティ] (Properties) を選択し、[全般] (General) タブで [出力ディレクトリ] (Output Directory) を変更します。"
  • C++ の場合 :


図 5 および図 6: プロジェクトのプロパティ
  • C# の場合 : [プロジェクト設定] (Project Preferences) → [ビルド] (Build) → [出力ディレクトリ] (Output directory) で出力ディレクトリを変更できます。

図 7: 出力パス

出力フォルダを変更すると、コンパイルを実行できます。DLL/EXE と PDB などのすべてのビルド ファイルが、OpticStudio で読み込むファイルの場所となる適切なフォルダに出力されます。


OpticStudio の起動およびユーザ定義面または

ユーザ定義オペランドの選択

DLL または EXE を使用できる状態になり、OpticStudio も起動しています。
  • ユーザ定義面の DLL を使用するには、それを光学系に追加します。ここでは、例としてシングレットを使用します。DLL をデバッグ モードで使用するユーザ定義面として、面 1 が設定されています。


図 8: OpticStudio のユーザ定義面
  • ユーザ定義オペランド UDOC (EXE 形式) を使用するには、評価関数に UDOC を読み込みます。必ず [タイムアウト (ms)] (Timeout (ms)) を任意のきわめて大きい値に設定します。これは、Visual Studio で UDOC を実際にデバッグする際に OpticStudio でタイムアウト エラーが生成されないようにするための措置です。


図 9: OpticStudio の UDOC

注 :
この時点では、まだ光学系も評価関数も更新しないようにします。更新すると、ユーザ定義面または UDOC が実行されますが、それらのコードにエラーがあると、ブレークポイントを設定する前にクラッシュする可能性があります。


プロセスへのアタッチ

Visual Studio に戻ると、デバッグを開始する準備が整います。
  • ユーザ拡張機能が DLL の場合、デバッガを OpticStudio.exe のプロセスにアタッチします。
  • ユーザ拡張機能が EXE の場合は、そのアプリケーション自体のプロセスにアタッチします。
以下でそれぞれの方法を紹介します。
  • DLL の場合 - OpticStudio へのアタッチ
実行している OpticStudio のプロセスにデバッガをアタッチできます。


図 10 および図 11: プロセスへのアタッチ

設定に関するコメント :
  • [アタッチ先] (Attach to) ボックスで、デバッグするコードの種類を選択します。
    • C++ を使用する場合は、[ネイティブ コード] (Native code) を選択します。
    • C# を使用する場合は、[マネージ コード] (Managed code) を選択します。
  • [選択可能なプロセス] (Available Processes) で、正しい OpticStudio プロセスを選択していることを確認します。起動する OpticStudio のインスタンスを 1 つのみにする方が簡潔です。

  • EXE の場合 - UDOC への直接アタッチ
UDOC をデバッグするには、OpticStudio にはアタッチせず、UDOC アプリケーション自体にアタッチします。したがって、UDOC コード自体に「一時停止」を設定しておき、実際の実行を一時停止する必要があります。一次停止を設定するには、C# の場合は Console.ReadKey()、C++ の場合は system("pause") を使用します。

C# のコードの例を以下に挙げます。

図 12: UDOC へのアタッチ

ここで評価関数を更新すると、コマンドライン ウィンドウが開き、「デバッガーをアタッチ (Ctrl+Alt+P) した後、キーをどれか押してください」というメッセージが表示されます。

図 13: 評価関数の更新

UDOC 自体をデバッガにアタッチします。UDOC の正しいコードを選択していることを確認します。下図の例では、コードが C# で作成されているので、[マネージ コード] (Managed code) を選択しています。

図 14: UDOC デバッガ

UDOC では、評価関数を更新して UDOC を検査する必要があるたびに、プロセスをアタッチする必要があります。


ブレークポイントの設定

次に、渡される値を調べるために、DLL コードにブレークポイントをいくつか設定します。
たとえば、以下の図ではユーザ定義面の 42 行目にブレークポイントを設定しています。

図 15: ブレークポイント


DLL/EXE の実行

OpticStudio で面をクリックすると、デバッガが起動します。

図 16: DLL の実行

UDOC を実行するには評価関数を更新します。
Visual Studio では、ブレークポイントに表示された黄色の矢印で、次に実行されるコードが示されます。
例として、ユーザ定義面をデバッグする際の変数に注目します。


図 17: DLL のデバッグ

[デバッグ] (Debug) → [ウィンドウ] (Window) → [ローカル] (Locals) ウィンドウに、DLL と OpticStudio の間で受け渡される値が表示されます。このウィンドウにより、OpticStudio と DLL の間で、2 種類のデータ構造体としてユーザ データ (UD) と固定データ (FD) が受け渡されていることがわかります。
  • UD には、面の頂点に接する平面上の光線位置 x、y、z (実際の面について DLL で計算して返された値)、光線の方向余弦 l、m、n、この面の法線 ln、mn、nn (計算して返された値) のほか、屈折率、透過率、光路長などのデータを収めています。


図 18: UD
  • FD には、おもに DLL では変更できないデータを収めています。このようなデータとして、レンズ データ エディタに記述された面データ (曲率半径、コーニック定数、各種パラメータなど)、光線の波長、偏光の状態、Type パラメータと Numb パラメータ (OpticStudio から DLL を呼び出して取得するデータを示します) などがあります。


図 19: FD

たとえば、上図では屈折率 N_BK7 が OpticStudio から DLL に渡されていることがわかります。


デバッガの停止

デバッグを終了するには、赤色の正方形をクリックします。

図 20: デバッガの停止


リリース モードでの DLL/EXE の頒布

DLL/EXE のデバッグが完了した後、必ず構成をデバッグからリリースに戻し、ソリューションを再コンパイルします。デバッグ構成のライブラリは再頒布できませんが、リリース構成のライブラリは再頒布が可能です。


結論

この記事では、DLL (ユーザ定義面) を使用する場合と EXE (ユーザ定義オペランド) を使用する場合について、ユーザ定義機能をデバッグする手法を解説しました。この手法は、DLL、ユーザ定義オペランド、ZOS-API 拡張機能、ユーザ解析など、OpticStudio に用意されているすべてのユーザ定義機能で使用できます。

また、次のリンクが効果的です。
実行中のプロセスへの Visual Studio デバッガーのアタッチ :
https://msdn.microsoft.com/ja-jp/library/3s68z0b3.aspx
デバッガーでのコード間の移動 :
https://msdn.microsoft.com/ja-jp/library/y740d9d3.aspx
Visual C++ 2013 および Visual C++ の再頒布可能パッケージ用の更新プログラム :
https://support.microsoft.com/ja-jp/help/3179560/update-for-visual-c-2013-and-visual-c-redistributable-package

GO


Similar Topics


Login
Existing Account
Email Address:


Password:


Select a Forum....



































Zemax Users Forum


Search