空腹おやじのログと備忘録

VBA(主にExcel)でいろいろな実験的な事とか、Linuxのコマンドとか設定とかについて忘れないように、あれこれと・・・

ExcelのVBAで使えるDLLを、C++(Visual Studio 2017)で作る。・・・その6 デバッグ編

初めに

DLLを作ってきましたが、作ったからには、動作確認が必要です。
今回は、DLLのデバッグ方法についてです。

このシリーズの記事を読んでくださった方は、基本的にVBAデバッグ経験者と思います。
ブレークポイントを設定して、ステップ実行したり・・・
基本的な部分は、DLLのデバッグでも同様です。

私の場合、VBAのコードから、DLLのコードにどうやって入っていくのかが
最初の時、わからなかったのでそのあたりについて説明します。
VBAでのデバッグ経験があることを前提に、類似した細かい部分は、端折ります。)

キーワード

アタッチ

アタッチとは、

デバッガーがプロセスやタスクを監視対象にすること

https://www.wdic.org/w/TECH/%E3%82%A2%E3%82%BF%E3%83%83%E3%83%81

今回の場合、Excelに接続して、監視できるようにするといった感じでしょうか。

デタッチ

こちらは、アタッチの逆。
アタッチした対象を監視下から外して、切り離すことです。

実際にやってみる

操作の流れ
  1. DLLを呼び出すExcelファイルの起動
  2. Visual Studio(DLLソリューション)の起動
  3. アタッチ
  4. DLL側コードへのブレークポイント設定
  5. VBAからDLL関数の呼び出し
  6. DLLコードのステップ実行
  7. デタッチ
アタッチ
  1. 対象のExcelファイルと、DLLソリューションを開く。
    • Visual Studioソリューション構成が「Debug」になっているか、確認しておくこと。
      f:id:Z1000S:20200126090401j:plain
    • DLLのプロジェクトがビルド済みであること。
  2. Visual Studioのメニューから、プロセスにアタッチを選択。
    • デバッグ」-「プロセスにアタッチ」をクリック
      f:id:Z1000S:20200126150813j:plain
  3. プロセスにアタッチダイアログから、DLLの呼び出し元となるExcelを探して、選択し、アタッチボタンをクリック。
    f:id:Z1000S:20200126151749j:plain
ブレークポイント

デバッグを開始する部分に、ブレークポイントを設定する。
F9キーで、ブレークポイントの設定、解除ができます。
ブレークポイントを設定したら、VBA側からDLLの関数を呼び出すコードを実行します。

ステップイン

1コードステートメントを実行します。
対象コードステートメントが、関数の呼び出しの場合、呼び出し先の関数の中の行へ入っていきます。
ショートカットキーは、F11キーです。

ステップオーバー

1コードステートメントを実行します。
ステップインと違うのは、対象行が、関数の呼び出しの場合、
呼び出し先の関数を実行しますが、呼び出し先関数の内部コードをステップ実行しません。
ショートカットキーは、F10キーです。

ステップアウト

ステップインとは逆に、ステップインした関数から抜ける場合に使用します。
ショートカットキーは、Shift + F11キーです。

続行

次のブレークポイントがある場合には、次のブレークポイントまで実行します。
次のブレークポイントがない場合、最後まで処理を続行します。
ショートカットキーは、F5キーです。

デバッグの停止

f:id:Z1000S:20200126162032j:plain

全てデタッチ

f:id:Z1000S:20200126152334j:plain

プロセスに再アタッチ

一度アタッチしたプロセスをデタッチした後に、再度同じプロセスにアタッチしたい場合には、プロセスに再アタッチを選択すると、アタッチするプロセスを選択する手間が省けます。
ショートカットキーは、Shift + Alt + P です。
f:id:Z1000S:20200126151926j:plain

ウォッチ

変数を右クリックして、ウォッチの追加をクリック
f:id:Z1000S:20200126165524j:plain
確認してみる。
f:id:Z1000S:20200126164845j:plain

自動変数

ウォッチのように自分で追加しなくても、スコープに応じて表示される変数が変わっていく。
f:id:Z1000S:20200126165758j:plain

ローカル

ウォッチのように自分で追加しなくても、スコープに応じて表示される変数が変わっていく。
f:id:Z1000S:20200126165811j:plain

メモリ

変数のアドレスを指定したり、アドレスを直接指定して、該当アドレスのメモリ状態を確認することが出来ます。
構造体の回で、packの指定有無で、データの配置を確認したときは、この方法を使用しました。
f:id:Z1000S:20200126152500j:plain

変数ppsaを選択する様子
f:id:Z1000S:20200126163540j:plain
選択した変数のアドレスのメモリ状態
f:id:Z1000S:20200126163552j:plain

アドレスを指定しなければいけないので、ポインタ変数の場合はそのまま指定できますが、
通常の変数の場合には、先頭に & を付けて指定する必要があります。
例えば、
int hoge;
の場合には、
&hoge
と指定します。

ポインタ変数の場合には、ローカルウィンドウなどからドラッグ・アンド・ドロップでも指定できます。

主なショートカットキー

VBAVisual Studio では、微妙にショートカットキーが違うので・・・

VBE でF8キーを押して、Visula Studio に入っても、F8キーを押して、
「あれ、進まない?あっ、F10だった。」とかよくやってますwww

項目VBAVisual Studio備考
ブレークポイントの設定/解除F9F9
全てのブレークポイントの解除Ctrrl + Shift + F9Ctrrl + Shift + F9
ステップインF8F11
ステップオーバーShift + F8F10
ステップアウトCtrl + Shift + F8Shift + F11
カーソル行の前まで実行Ctrl + F8Ctrl + F10
デバッグの停止Shift + F5

その他(情報提供依頼)

Rubberduckというアドインがあって、便利そうだのだけど、
こいつをインストールしたところ、Visual Studioでアタッチしても、ExcelのVBEから入っていけない(デバッグできない)現象に遭遇。
現状アンイストールしか対応方法がわからずじまい。
解決策をご存知の方、いらっしゃいましたら教えてください。

最後に

今回で、VBAで使えるDLL作成に関する記事は終了です。
後半は、手抜き気味のような気もしますが、参考になれば幸いです。