はじめに
ググっても同様の記録が見当たらなかったので、投稿します。
MacでJUCEを使ってVSTプラグインを開発中に以下の現象にハマった件の記録です。
- VSTのビルドに失敗する
- CLIでビルドすると途中で Segmentation Fault している
- これを見つけるためにcmakeを導入した
- AU版、Standalone版はビルドできる
- 特に変なプログラムを書いたつもりはない(なかった)
結論
- BAD ACCESSが原因(私の場合)
- LLDB で juce_vst3_helper を起動したら原因がわかった
- ビルドプロセスを手動でデバッグ実行したらヒントが得られる
ビルドエラーの詳細
私が遭遇したビルドエラーは以下の内容でした。
XXX
はmacのユーザ名、YYY
はプラグイン名です。またプラグインのバージョン番号はとりあえず1.0.0
としてありますので適宜読み替えてください。
Xcodeのエラーメッセージ
Command PhaseScriptExecution failed with a nonzero exit code
Xcodeの詳細ログ
/Users/XXX/Library/Developer/Xcode/DerivedData/XXX/Build/Intermediates.noindex/YYY.build/Debug/YYY - VST3.build/Script-5EE3CAAC0943FC46AD27AAAB.sh: line 6: 75859 Segmentation fault: 11 "$CONFIGURATION_BUILD_DIR/juce_vst3_helper" -create -version "1.0.0" -path "$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME" -output "$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME/Contents/Resources/moduleinfo.json"
Command PhaseScriptExecution failed with a nonzero exit code
Cmake(+ninja)のログ
(色々書かれている)
-- Replacing invalid signature with ad-hoc signature
/Users/XXX/.../YYY.vst3: replacing existing signature
/bin/sh: line 1: 76137 Segmentation fault: 11 /Users/XXX/.../juce_vst3_helper -create -version 1.0.0 -path /Users/XXX/.../YYY.vst3 -output /Users/XXX/.../YYY.vst3/Contents/Resources/moduleinfo.json
ninja: build stopped: subcommand failed.
原因調査
lldb で juce_vst3_helper を起動し、rコマンドでデバッグ起動しました。
(make または ninja を走らせたのと同じディレクトリで、ビルド失敗直後にCLI上で実行。)
> lldb /Users/XXX/…/juce_vst3_helper
(lldb) r -create -version 1.0.0 -path /Users/XXX/.../YYY.vst3 -output /Users/XXX/.../YYY.vst3/Contents/Resources/moduleinfo.json
これを実行すると、segmentation fault したところのスタックトレースがコンソールに出てきました。
なるほどBAD ACCESSが有ったので、ソースコードを修正し再ビルドしたところ、vst版もビルドできるようになりました。
ビルドされたvstプラグインの動作も、特に問題なし。
最後に
- LLDBは使いにくいけど、便利。
- 自作プログラム以外で初めて使った。こうやれば使えるのか。。。
- juce_vst3_helper はプラグインの動作確認をしているっぽい。
- Xcode のログを見ると
DBG()
の出力が出ていたりする - 調べてないけど、調べれば色々出てきそう
- Xcode のログを見ると