• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <debugging>

    std::is_debugger_present

    namespace std {
      bool is_debugger_present() noexcept; // (1) C++26
    }
    

    概要

    デバッガ実行中か判定する。

    この関数は、デバッガがプログラムを監視中かどうかを判定する。プラットフォーム固有の結果を決定できない場合、ユーザーがこの関数を定義することで柔軟に動作を制御できる。

    プログラムがデバッガ実行中かを判定できることで、デバッガ実行中に問題の診断に役立つ追加の出力やテストができる。

    置き換え可能

    ユーザーのプログラムでこの関数を定義することで、標準ライブラリで定義されるデフォルトの動作を置き換えることができる。

    要求される振る舞い

    デフォルトの振る舞い

    効果

    デバッガがプログラムを監視中である場合、実装はtrueを返す。

    例外

    投げない

    備考

    • 実装は、プログラムがデバッガによって監視されているかどうかを判定するために、必要に応じて即時クエリを実行する
    • Windowsまたは同等のシステムでは、この関数の動作はWin32関数の::IsDebuggerPresent()を呼び出すことで実現できる
    • POSIX環境では、監視親プロセスをチェックすることで実現できる。その際、監視親プロセスがデバッガであるかどうかは最善の努力で判定する
    • この関数は、結果のキャッシュを規定しない。既存の実装もデバッガの存在クエリについての結果をキャッシュするようなことはしておらず、そのコストが問題にはなっていなかった。また、結果をキャッシュする場合、std::breakpoint_if_debugging()のインタフェースにも影響してしまう

    #include <print>
    #include <debugging>
    #include <cmath>
    
    // なんらかの処理
    double g(double a, double b) {
      return a / b;
    }
    
    double f(double a, double b) {
      double ret = g(a, b);
      if (std::isnan(ret) || std::isinf(ret)) {
        // 演算結果でNaNかinfが発生したらブレークし、
        // デバッガでパラメータ (ローカル変数) などを確認する
        if (std::is_debugger_present()) {
          std::breakpoint();
        }
      }
      return ret;
    }
    
    int main() {
      double ret = f(2.0, 0.0);
      std::println("{}", ret);
    }
    

    出力例

    inf
    

    バージョン

    言語

    • C++26

    処理系

    参照