プログラミング
C++26: 新しいデバッグヘッダー
C++26: The New Debugging Header (sandordargo.com)
要約
C++26では、プログラムからブレークポイントを設定するための標準化された方法が導入されました。新しい`<debugging>`ヘッダーには、`std::breakpoint()`(無条件ブレークポイント)、`std::is_debugger_present()`(デバッガーの存在確認)、`std::breakpoint_if_debugging()`(デバッガーが存在する場合のみブレークポイントを設定)の3つの関数が含まれます。これにより、これまでプロジェクトごとに独自に実装されていたデバッグ機能が標準化され、コードの可読性と移植性が向上します。
全文翻訳
Sandor Dargo's Blog
C++、ソフトウェア開発、書籍について
ホーム タグ アーカイブ 書籍 スピーキング デイリー C++ワークショップ こんにちは... 購読
ブログ 2026 09 30 C++26: 新しいデバッグヘッダー
投稿 キャンセル
C++26: 新しいデバッグヘッダー
Sandor Dargo
2026年9月30日
3分
C++でプログラム的にブレークポイントを設定する必要があった場合、おそらく次のようなコードを書いたことがあるでしょう。
```cpp
#if defined(_MSC_VER)
__debugbreak();
#elif defined(__clang__)
__builtin_debugtrap();
#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
__asm__ volatile("int3");
#else
raise(SIGTRAP);
#endif
```
主要なC++プロジェクトのほとんどが、この車輪を再発明しています。Boost.Testには`debugger_break()`、Catch2には`CATCH_BREAK_INTO_DEBUGGER`、Dear ImGuiには`IM_DEBUG_BREAK()`、Unrealには`UE_DEBUG_BREAK`があります。必要なプラットフォーム知識は難解ですが、ツール実装者にはよく知られています。ただ、標準化されていませんでした。
C++26では、Rene Ferdinand Rivera Morellのおかげで、P2546R5とそのコンパニオンであるP2810R4により、これが修正されます。新しい`<debugging>`ヘッダーは3つの関数を提供します。
3つの関数
```cpp
#include <debugging>
namespace std {
void breakpoint() noexcept;
bool is_debugger_present() noexcept;
void breakpoint_if_debugging() noexcept;
}
```
これら3つの関数はすべて`noexcept`であり、すべてフリースタンディングです。`constexpr`ではありません。デバッグは実行時の懸念事項です。
std::breakpoint()
無条件ブレークポイントです。デバッガーがアタッチされている場合、実行は停止し、制御はデバッガーに渡されます。x86では、これは通常、単一の`int3`命令にコンパイルされます。
デバッガーが存在しない場合、動作は実装定義です。ほとんどのプラットフォームでは、プロセスはシグナル(SIGTRAPなど)を受け取り、シグナルがキャッチされない限り終了します。
std::is_debugger_present()
プログラムが現在デバッガーによってトレースされているかどうかを返します。チェックは呼び出しごとに即座に行われます。デバッガーは実行中にいつでもアタッチまたはデタッチできるため、結果はキャッシュされません。
これが内部でどのように機能するかは、プラットフォームによって異なります。例えばWindowsでは、実装は`::IsDebuggerPresent()`を呼び出すかもしれません。Linuxでは、GCCのlibstdc++は`/proc/self/status`を読み取り、`TracerPid`フィールドをチェックします。標準は特定のメカニズムを義務付けていません。セマンティクスは実装定義であり、意図された動作は非正規の注記で説明されています。
この関数を興味深いものにしているのは、`operator new`や`operator delete`と同じ意味で、置き換え可能であることです。独自のバージョンを定義できます。
```cpp
bool std::is_debugger_present() noexcept {
return my_hardware_debug_flag;
}
```
これはP2810R4によって導入され、フリースタンディングの問題を解決しました。ベアメタルプラットフォームでは、OSレベルでデバッガーを検出する方法がない場合があります。置き換え可能性がないと、関数はフリースタンディングから除外される(どこでも#ifdefガードを強制する)か、役に立たないデフォルトを返すことになります。置き換え可能性により、プラットフォームが提供するものに配線できます。
std::breakpoint_if_debugging()
ほとんどのユーザーが使用する便利な関数です。これは次と同等です。
```cpp
if (std::is_debugger_present()) {
std::breakpoint();
}
```
デバッガーがアタッチされている場合、ブレークポイントに到達します。そうでない場合は、何も起こりません。これは、Catch2、Boost.Test、およびその他のすべてのフレームワークが手動で実装しているパターンです。
ブレークポイントを超えて
`is_debugger_present()`を個別の関数として持つことは、条件付きブレークポイント以上のものを提供します。これを使用して、次のようなことができます。
デバッグ中に余分な診断出力を生成する
ステップ実行中に発生する可能性のあるタイムアウトを無効にする
デバッグをより困難にする最適化をスキップする
関心の分離は意図的です。`breakpoint()`と`is_debugger_present()`は直交するビルディングブロックであり、`breakpoint_if_debugging()`はその便利な組み合わせです。
結論
`<debugging>`は、なぜこれほど時間がかかったのか不思議に思わせるC++26の追加機能の1つです。プラットフォーム知識はよく理解されており、主要なプロジェクトはすでに独自のバージョンを持っており、APIは3つの関数です。最も有用な標準ライブラリの追加機能は、最もシンプルなものであることがあります。
さらに深くつながる
この記事が気に入ったら、いいねボタンを押して、私のニュースレターを購読し、Twitterでつながりましょう!
C++クオンツ/トレーディングの面接を準備しているなら、GetCrackedをチェックしてください。
cpp dev cpp26 debugging
この記事は著者のCC BY 4.0ライセンスに基づいています。
共有
最近の更新
C++26: 構造化バインディングにおける属性
C++26: std::indirect
CppCon 2026のトリップレポート
C++26: std::hive
C++26: ライブラリ機能の非推奨または削除
トレンドタグ
cpp books watercooler career tutorial cpp26 cpp23 stl algorithms self-improvement
コンテンツ
さらに読む
2025年1月1日
2025-01-01T00:00:00+01:00
C++26: ユーザー生成のstatic_assertメッセージ
C++26の世界への最初の探求は、オプションのエラーメッセージ付きの=deleteについてでした。これにより、ソースコードの可読性が向上し、潜在的にエラーメッセージも改善されます。この次のパートでは...
2025年1月8日
2025-01-08T00:00:00+01:00
C++26: 名前なしのプレースホルダー
C++26の探求を続けましょう。この記事では、Corentin JabotとMicheal ParkがP2169R4で提案したコア言語機能について説明します。新しい標準により、クールな名前なしのプレースホルダが得られます...
2025年1月22日
2025-01-22T00:00:00+01:00
C++26: パックインデックス
C++11は、可変引数関数に依存する代わりに、関数に未定義数のパラメータを安全に渡すためのパラメータパックを導入しました。パックは便利な機能ですが、以来...
CppCon 2026のトリップレポート
CppConでのC++とAI: エージェントを使わなければならないのか?
コメントはDisqusによって提供されています。
C++開発者向け、より良いコード。より良いキャリア。モダンC++と成長に必要なことについてのメールを週に1通。まだ模索中の誰かによって書かれています。
購読
スパムは送信しません。いつでも購読解除できます。
Kitで構築
トレンドタグ
cpp books watercooler career tutorial cpp26 cpp23 stl algorithms self improvement