#原因と解決策(TL;DR)
VSCodeがTerminalを開く権限がないのが本質的な原因っぽいです。その上、デバッグはVSCodeのC++アドオン(vscode-cpptools
)経由で行うのですが、VSCodeがTerminalを開くPermissionがない場合に、Permissionを与えるか否か尋ねるダイアログが出てほしいところ、何故か出ないらしいです。厄介。
ただ、デバッグと別の手段でVSCodeからターミナルを起動させようとすれば、Permissionを与えるか否か尋ねるダイアログは普通に出るっぽいです。
ということで、今回はその一例として、TasksからTerminalを起動し、その過程でPermissionを与えることで、VSCode上のデバッガからもTerminalを起動できるようにしましょう。
VSCode公式のC++アドオンのissue(https://github.com/microsoft/vscode-)cpptools/issues/5079
に則って作業していきます。
まずは以下のtaskをtasks.json
に追加。
{
"label": "Open Terminal",
"type": "shell",
"command": "osascript -e 'tell application \"Terminal\"\ndo script \"echo hello\"\nend tell'",
"problemMatcher": []
}
コマンドパレット(⌘+Shift+P
)でタスクを実行(>Run Tasks
でサジェスト)、先程tasks.json
に追記したOpen Terminal
を選択
→「VSCodeがTerminal開こうとしてるけど、開いてOK?」という旨のダイアログが出る
(画像はissueからの借り物)
OKで、VSCodeがTerminalを開く権限を得ます。
これにより、VSCode上のデバッガからも、Terminalを開くことが可能となります。
開発環境
問題が起きた開発環境はこんな感じでした。
- MacBook Air (Retina, 13-inch, 2019)
- MacOS 10.15.4
- VSCode Version 1.45.0
- ms-vscode.cpptools 0.28.0
記事を立てた経緯
競プロの過去問を解く際、セグフォがしつこく出て消耗することが増えたため、VisualStudioのデバッガのように、BreakPointやウォッチやらがVSCodeのGUI上で管理できないかな?と思い、色々調べてデバッグ環境を構築することにしました。
ところで、VSCodeでは、デバッグ出力はすべて専用のDebug Consoleに出力され、標準入力はできません。1プログラムに標準入力を与える場合、デバッグの詳細を記述するための設定ファイルである2launch.json
に、タイトルでも登場した以下のKeyValueを追記する必要があります。
{
...
"externalConsole":true,
...
}
ところが、自分の環境の場合、これを記述してもターミナルが立ち上がらず、プログラムが標準入力待ちのコマンドから一生前に進まない状態になってしまいました。
システム環境設定→セキュリティーとプライバシーを見に行ったり、別画面の端っこにダイアログが出ていないか目を皿にして探したりしても何も見つかりません。
そんなわけで、ネットで色々調べた所、先程のissueを発見した次第です。
あとがき
先程の方法で、「ターミナルを出すだけなら」上手くいくと思います。デフォルトだと、デバッグ後にターミナルが即落ちして出力が見えなかったりするっぽく、追加で色々設定しなきゃいけないみたいですね。
うーん、面倒くさい…(小声)3
-
入力フォームはありますが、デバッグ時専用のコマンドを入力するためのもののようです。Chrome上でJSのデバッグするとき見たく、変数入れたら値が帰ってきたりするのかな?私はドシロートなのでわかりません。 ↩
-
これも、
launch.json
は「デバッグの詳細を記述する」もんだと私が勝手に思っているだけで、本当はもっと色々書けるのかもしれません。ウソつきがしたいわけではないのです。ただまちがいをするだけなのです……(気になる点はぜひぜひコメントでご指摘ください。加筆修正いたします。) ↩ -
ほならね、それこそIDE使えって話でしょ?でもIDEを競プロに使おうとするとプロジェクトを乱立しなきゃいけなくてダルい…問題(某競プロ界のスゴい人もおっしゃってたような気がしますね)少なくとも、VSCoderとしてやっていくなら、ある程度は自分でmakefile弄ってconfig.jsonを編集・保守する覚悟の準備をしておかなければならない、ということは間違いないでしょう。 ↩