ラベル Debug の投稿を表示しています。 すべての投稿を表示
ラベル Debug の投稿を表示しています。 すべての投稿を表示

2022年8月18日木曜日

VM上のLinuxをVSCodeでPHPデバッグできなかった

ステップ実行できない!

もう何度も環境構築していて、手慣れているはずのVSCodeでPHPをデバッグする環境を用意していたら、なかなか動いてくれなかったのよ、これが。
簡単に環境を書きますと
ホスト:Windows PC+Visual Studio Code
リモート:VMWare + CentOS7.9
Apache:2.4.6
PHP:7.4.30 Zend Engine v3.4.0
Xdebug:3.1.5
ってな環境で、VM上のソースをデバッグできるようにようにしてます

SSHの設定とか、インストールの手順とかは書きません。悪しからずm(_ _"m)

やったこと(失敗の記録)

WEBを検索すると、以下のような記述が目立ちましたが、これはxdebugの古いバージョン用なので動きません

# vi /etc/php.ini

[xdebug]
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.remote_host=192.168.xxx.xxx
xdebug.remote_enable = 1
xdebug.remote_autostart = 1

ちなみに、192.168.xxx.xxxは、VM上のOSのIPアドレスです。

xdebug の新バージョンでの記述

以下のように記述するのが正しいと書いてありました。

# vi /etc/php.ini

[xdebug]
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.mode=debug
xdebug.client_host=192.168.xxx.xxx
xdebug.client_port=9003
xdebug.start_with_request=yes
xdebug.discover_client_host=1

動いてくれません・・・

どうやって原因を突き止めればいいか、いろいろ悩みました

phpinfo()を使って、動きを確認してみました。

$ vi /public_html/phpinfo.php

<?php
phpinfo();


このファイルを作ってブラウザで表示し、xdebug の部分を見てみますと・・・

Step Debuggerの部分が disabled になってます。
xdebug.client_hostの部分が localhost になってます。
設定したはずの内容とは異なっています。なぜじゃぁぁぁぁ?
と悩むこと数時間。

xdebug.iniを修正する。

/etc/php.d/15-xdebug.ini ファイルを修正します。

# vi /etc/php.d/15-xdebug.ini

zend_extension=xdebug.so
xdebug.mode=debug
xdebug.client_host=192.168.xxx.xxx
xdebug.client_port=9003
xdebug.start_with_request=yes
xdebug.discover_client_host=1

# service httpd restart

再度 phpinfo()を見てみましょう

Step Debuggerの部分が enabled になってます。
xdebug.client_hostの部分が 192.168.0.xxx と設定どおりになってくれてますね。

無事、VSCode上のブレークポイントで止まってくれるようになりました。(^_^)v
めでたしめでたし。

2020年11月28日土曜日

「マネージとネイティブの境界の前でハンドルされませんでした」という例外でハマった。

 開発中のDLLをデバッグしているときに、「型 'System.Runtime.InteropServices.COMException' の例外が XXX.dll で発生しましたが、マネージとネイティブの境界の前でハンドルされませんでした」
という例外が出るようになって、非常に困ったので、まとめ。



例外が出るのはいいとして、

□この種類の例外がスローされると中断します
のチェックボックスをOFFにしても、必ず中断されてしまうから困ったのです。

しかも、ですよ。
catch(Exception e){}のブロックに入ってくれない。
最もひどい状態では、同じ部分で延々と例外のダイアログが表示され続けるために
「デバッグの中止」
を使ってプロセスを落とすしかなくなるんです。

ちなみに開発環境は Visual Studio 2015 です。
開発しているのは、Office Outlook 用のアドインDLL
メールのヘッダに独自に設定している拡張ヘッダがあるかどうかを調べるコードです。
一般のメールにはそのヘッダはないので、「そんなヘッダはありません」という例外が出ます。(それはいい)
try{}catch{}ブロックでその例外を無視すればいいだけのコードです。

まず、「catch(Exception e){}のブロックに入ってくれない。」件に関しては、プロジェクトのProperies 設定の「デバッグ」で
□ネイティブコードのデバッグを有効にする
をチェックすることで、catch{}ブロックに入ってくるようになりました。


しか~し。
□この種類の例外がスローされると中断します
のチェックボックスをOFFにしても必ず例外で中断する現象は変わりません。

開発環境によってはこの問題が発生しないので、上手くいく環境といかない環境を比較しながら調べてみました。
結論:「ツール」-「オプション」-「デバッグ」で
□例外が AppDomain またはマネージ/ネイティブの境界を超える場合にブレークする(マネージのみ)
を OFF にします。



以上で例外での中断がなくなりました。
この問題の解決にもけっこうな日数かかりました。orz