質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

525閲覧

VSCode上のターミナルでstd::abort()を呼んでも強制終了しない(C++)

TON

総合スコア4

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2025/03/12 13:35

編集2025/03/12 14:34

実現したいこと

VSCode上のターミナルでstd::abort()を呼んで強制終了させられるようにする。

発生している問題・分からないこと

VSCode上のターミナルでstd::abort()を呼んでも強制終了せず、一向にプログラムが終了しません。Ctrl + Cを押しても応答がなく、ターミナルを終了する他ありません。
しかし、Macの標準ターミナル上で実行したところ、
zsh: abort ./a.out
というメッセージと共に正しく強制終了しました。

このような現象がVSCodeでのみ起こる原因がわからず困っている状況です。

エラーメッセージ

error

1zsh: abort ./a.out (Macの標準ターミナルでのみ)

該当のソースコード

C++

1#include <cstdlib> 2 3int main() { 4 std::abort(); 5} 6

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ソースコードを以下のようにすると、Assertion failed: (0), function main, file main.cpp, line 4.というエラーが出力されますが、やはりブログラムが強制終了されません。

#include <cassert>

int main() {
assert(0);
}

補足

MacBook Air Apple M3 バージョン14.5
VSCode 1.98.1
C++20
g++ (Homebrew GCC 13.2.0) 13.2.0

実行したコマンド
g++ -std=c++20 main.cpp
./a.out

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2025/03/13 12:27

Macを持ってないのですが、回答もコメントも付かないので書いてみます。 > 強制終了せず は、具体的にどういう現象でしょうか? 言い換えると、何を見てどういう理由で「強制終了せず」と思ったのでしょうか? > zsh: abort ./a.out このメッセージはzshが出していますが、VSCode上のターミナルで動いているシェルもzshでしょうか?
TON

2025/03/13 13:56

コメントいただきありがとうございます。 > std::sbort()によってプログラムを異常終了させることを、ここでは強制終了と呼んでいました。正しい表現ができておらず申し訳ありません。 本来は Assertion failed: (0), function main, file main.cpp, line 4. zsh: abort ./a.out という2つのメッセージが出力された後にブログラムが異常終了し、次のコマンドが打てる状態になるはずですが、VSCode上のターミナルでは Assertion failed: (0), function main, file main.cpp, line 4. というメーセージのみが出力され、次のコマンドが打てない(Ctrl + Cも受け付けられない)状態になります。実行したコマンドやファイルが同じであるにも関わらずこのような現象が起きたことから、VSCode上ではプログラムが正しく終了できていないと判断しました。 > Macの標準ターミナルと同様に、VSCode上のターミナルで動いているシェルもzshです。
otn

2025/03/13 14:36

> Assertion failed: (0), function main, file main.cpp, line 4. それは、std::sbort() じゃなくて、assert(0) のプログラムでは?
TON

2025/03/13 14:43

「上記の詳細・結果」に記載した #include <cassert> int main() { assert(0); } のブログラムを実行した結果を誤って載せてしまいました。「該当のソースコード」にある #include <cstdlib> int main() { std::abort(); } のブログラムを実行すると、先ほどのコメントから Assertion failed: (0), function main, file main.cpp, line 4. の行を無くした結果が得られます。
otn

2025/03/13 16:36

VSCodeコンソールのzshで、 sh -c 'exit 123' だとすぐにzshのプロンプトが出て、 echo $? で、123が表示される。 sh -c 'kill -6 $$' だと、何もメッセージが表示されず実行も終わらず Ctrl-C もきかない ということですかね。 sh -c 'kill -9 $$' も同じでしょうか?
TON

2025/03/13 21:19

std::abort()の挙動とは違い、VSCodeターミナルとMacの標準ターミナルで同じ結果が得られました。 sh -c 'exit 123' ではすぐに次のプロンプトが現れ、 echo $? では123が表示され、 sh -c 'kill -6 $$' では zsh: abort sh -c 'kill -6 $$' というメッセージが出力され、実行も終わります。 sh -c 'kill -9 $$' の場合は zsh: killed sh -c 'kill -9 $$' というメッセージになります。
otn

2025/03/14 15:45

> sh -c 'exit 123' これはまあ、C/C++で、exit(123); をコールしたのとほぼ同じなので > ではすぐに次のプロンプトが現れ で普通ですね。 コンソールの操作方法自体が間違ってないかという確認のための質問でした。 > sh -c 'kill -6 $$' は、std::abort(); とほぼ同じはずですが、同じはずにもかかわらず、VScodeのzshで、 (1) sh -c 'kill -6 $$' ⇒ ちゃんとプログラムが終了して、zshがエラーメッセージを出す (2) std::abort(); ⇒ プログラムが終了しない。Ctrl-C も効かない ということだと、ちょっと分かりません。 他の言語(CとかPythonとかその他)で、同じく「自身のプロセスにSIGABRTを送る」を書いてみて、症例を増やして怪しい場所を探るのですかね。 > sh -c 'kill -9 $$' の場合は は、kill -6 が、両zshで異なる結果だった場合、さすがに kill-9 は同じだろうということを確認するための質問でしたが、kill -6 の結果が両zshで同じだったので、意味が無くなりました。
TON

2025/03/15 02:24

ご確認いただきありがとうございました。もう少し自分でも問題箇所を探ってみようと思います。 なお、Pythonであれば import os os.abort() のようなコードが、C言語であれば #include <stdlib.h> int main() { abort(); } や #include <assert.h> int main(){ assert(0); } といったコードが同様の挙動を示します。 また、Pythonの assert 0 や import sys sys.exit(1) といったコードについてはVSCodeでも正常に動作します。
otn

2025/03/15 03:51

なるほど。Pythonでも C++ std::abort() と同様ということであれば、言語側の問題ではなさそうですね。 子プロセスの終了を待つ場合、子プロセスが普通に終了した(戻りコードがゼロか、非ゼロかにかかわりなく)のか、子プロセスがシグナルで終了した(abort関数を呼ぶとSIGABRTシグナルで終了する)のかは区別付くので、zshだと後者は何らかのメッセージを出すなど動作を変えているわけですが、zshのそこにバグがあるとは思えないので、何ら設定の違いによるものかと思います。 Macがないので、これ以上は、アドバイスできません。 Windows10+VSCode+(cmd/pwsh/bash/zsh)では、プログラムはちゃんと終了して次のプロンプトが出ます。abortの旨のメッセージが出るかどうかはシェル次第。
melian

2025/03/15 04:26

参考までに、VScode の GitHub リポジトリにある issues に以下の報告が上がっています。ただ、4年半前のことですし、今回の件と関係があるのかどうかも不明です。 Lagging/freezing using VSCode Insiders in Big Sur · Issue #107103 · microsoft/vscode https://github.com/microsoft/vscode/issues/107103 解決策としてはアプリケーションの署名を削除するとのこと。 https://github.com/microsoft/vscode/issues/107103#issuecomment-731664821
TON

2025/03/15 08:42

otnさん Mac特有の問題である可能性が高そうですね... こちらでVSCodeのターミナルの設定等を再度調べてみようと思います。様々なアドバイスをいただき、ありがとうございました。
TON

2025/03/15 08:45

melianさん 解決方法を提案いただきありがとうございます。 アプリケーションの署名を削除してみましたが、今回発生している問題は残ったままでした。今回の件とは異なった問題なのかもしれません。
otn

2025/03/15 12:50

VSCodeのバグという可能性はまだ考えていませんでしたが、同件は4年経ってるのでさすがに修正済みでしょう。近辺に類似別件のバグがあるということかもしれません。 VScodeから起動するのを zsh => bash にしてみて変化を見るなども原因絞り込みに良いかもしれません。
TON

2025/03/15 16:11

zsh => bash と変更して試してみましたが、プログラムが終了しない問題は解決しませんでした。 VSCode上のターミナルでのみこの問題が起こるため、何か別のVSCodeのバグを踏んでいそうです。 また、見つかった気になる挙動として、VSCodeを開いた一回目の ./a.out の実行でのみ正しく std::abort() が動作する、というものがあります。VSCodeを開いた後に #include <cstdlib> int main() { std::abort(); } のプログラム(main.cppとする)をコンパイルして実行すると正しく終了するのですが、もう一度実行すると終了しなくなります。流れとしては以下の通りです。 % g++ main.cpp % ./a.out zsh: abort ./a.out (← VSCodeを開いて一回目の実行では正しく終了する) % ./a.out (←この実行では何も出力されず、Ctrl+Cも受け付けないような状態となる)
TON

2025/03/15 17:23 編集

デバッグのためにHomebrewでgdbをインストールした後、std::abort()がVSCodeでも正しく動作するようになりました。おそらくgdbは関係なく、gdbをインストールした際にHomebrewがアップデートされたことで、何らかのバグが解消されたのかもしれません。解決した理由については全くわかっていませんが、発生している問題を解決することができました。 改めて、otnさん、melianさん、問題解決に向けてさまざまなご提案をいただきありがとうございました!
guest

回答1

0

自己解決

Homebrewでgdbをインストールした後、std::abort()がVSCodeでも正しく動作するようになりました。おそらくgdbは関係なく、gdbをインストールした際にHomebrewがアップデートされたことにより、何かしらのバグが解消されたのではないかと思われます。

投稿2025/03/15 17:23

TON

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問