<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.18">
<meta name="author" content="René Ferdinand Rivera Morell">
<meta name="copyright" content="Copyright 2021 René Ferdinand Rivera Morell">
<title>Debugging Support</title>
<style>
@import url(https://fonts.googleapis.com/css?family=Varela+Round|Open+Sans:400italic,600italic,400,600|Ubuntu+Mono:400);
/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
/* ========================================================================== HTML5 display definitions ========================================================================== */
/** Correct `block` display not defined in IE 8/9. */
article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; }

/** Correct `inline-block` display not defined in IE 8/9. */
audio, canvas, video { display: inline-block; }

/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */
audio:not([controls]) { display: none; height: 0; }

/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */
[hidden], template { display: none; }

script { display: none !important; }

/* ========================================================================== Base ========================================================================== */
/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */
html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ }

/** Remove default margin. */
body { margin: 0; }

/* ========================================================================== Links ========================================================================== */
/** Remove the gray background color from active links in IE 10. */
a { background: transparent; }

/** Address `outline` inconsistency between Chrome and other browsers. */
a:focus { outline: thin dotted; }

/** Improve readability when focused and also mouse hovered in all browsers. */
a:active, a:hover { outline: 0; }

/* ========================================================================== Typography ========================================================================== */
/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */
h1 { font-size: 2em; margin: 0.67em 0; }

/** Address styling not present in IE 8/9, Safari 5, and Chrome. */
abbr[title] { border-bottom: 1px dotted; }

/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */
b, strong { font-weight: bold; }

/** Address styling not present in Safari 5 and Chrome. */
dfn { font-style: italic; }

/** Address differences between Firefox and other browsers. */
hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }

/** Address styling not present in IE 8/9. */
mark { background: #ff0; color: #000; }

/** Correct font family set oddly in Safari 5 and Chrome. */
code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; }

/** Improve readability of pre-formatted text in all browsers. */
pre { white-space: pre-wrap; }

/** Set consistent quote types. */
q { quotes: "\201C" "\201D" "\2018" "\2019"; }

/** Address inconsistent and variable font size in all browsers. */
small { font-size: 80%; }

/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }

sup { top: -0.5em; }

sub { bottom: -0.25em; }

/* ========================================================================== Embedded content ========================================================================== */
/** Remove border when inside `a` element in IE 8/9. */
img { border: 0; }

/** Correct overflow displayed oddly in IE 9. */
svg:not(:root) { overflow: hidden; }

/* ========================================================================== Figures ========================================================================== */
/** Address margin not present in IE 8/9 and Safari 5. */
figure { margin: 0; }

/* ========================================================================== Forms ========================================================================== */
/** Define consistent border, margin, and padding. */
fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }

/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */
legend { border: 0; /* 1 */ padding: 0; /* 2 */ }

/** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */
button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ }

/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */
button, input { line-height: normal; }

/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */
button, select { text-transform: none; }

/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */
button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ }

/** Re-set default cursor for disabled elements. */
button[disabled], html input[disabled] { cursor: default; }

/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */
input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ }

/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */
input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; }

/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }

/** Remove inner padding and border in Firefox 4+. */
button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }

/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */
textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ }

/* ========================================================================== Tables ========================================================================== */
/** Remove most spacing between table cells. */
table { border-collapse: collapse; border-spacing: 0; }

meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; width: 768px; }

meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; width: 1280px; }

meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; width: 1440px; }

*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }

html, body { font-size: 100%; }

body { background: #fefdfd; color: rgba(0, 0, 0, 0.8); padding: 0; margin: 0; font-family: "Open Sans", sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; }

a:hover { cursor: pointer; }

img, object, embed { max-width: 100%; height: auto; }

object, embed { height: 100%; }

img { -ms-interpolation-mode: bicubic; }

#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; }

.left { float: left !important; }

.right { float: right !important; }

.text-left { text-align: left !important; }

.text-right { text-align: right !important; }

.text-center { text-align: center !important; }

.text-justify { text-align: justify !important; }

.hide { display: none; }

.antialiased { -webkit-font-smoothing: antialiased; }

img { display: inline-block; vertical-align: middle; }

textarea { height: auto; min-height: 50px; }

select { width: 100%; }

p.lead { font-size: 1.21875em; line-height: 1.6; }

.subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { line-height: 1.25; color: #002c5e; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; }

/* Typography resets */
div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; }

/* Default Link Styles */
a { color: #005580; text-decoration: underline; line-height: inherit; }
a:hover, a:focus { color: #078d71; }
a img { border: none; }

/* Default paragraph styles */
p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 1.5; margin-bottom: 1.25em; text-rendering: optimizeLegibility; }
p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }

/* Default header styles */
h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: "Varela Round", sans-serif; font-weight: 400; font-style: normal; color: #00326b; text-rendering: optimizeLegibility; margin-top: 0.8em; margin-bottom: 0.5em; line-height: 1.0625em; }
h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #057aff; line-height: 0; }

h1 { font-size: 2.125em; }

h2 { font-size: 1.6875em; }

h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; }

h4 { font-size: 1.125em; }

h5 { font-size: 1.125em; }

h6 { font-size: 1em; }

hr { border: solid rgba(145, 135, 84, 0.15); border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; }

/* Helpful Typography Defaults */
em, i { font-style: italic; line-height: inherit; }

strong, b { font-weight: bold; line-height: inherit; }

small { font-size: 60%; line-height: inherit; }

code { font-family: "Ubuntu Mono", "Inconsolata", monospace; font-weight: 400; color: #331d00; }

/* Lists */
ul, ol, dl { font-size: 1em; line-height: 1.5; margin-bottom: 1.25em; list-style-position: outside; font-family: inherit; }

ul, ol { margin-left: 1.5em; }
ul.no-bullet, ol.no-bullet { margin-left: 1.5em; }

/* Unordered Lists */
ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ }
ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; }
ul.square { list-style-type: square; }
ul.circle { list-style-type: circle; }
ul.disc { list-style-type: disc; }
ul.no-bullet { list-style: none; }

/* Ordered Lists */
ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; }

/* Definition Lists */
dl dt { margin-bottom: 0.3125em; font-weight: bold; }
dl dd { margin-bottom: 1.25em; }

/* Abbreviations */
abbr, acronym { text-transform: uppercase; font-size: 90%; color: rgba(0, 0, 0, 0.8); border-bottom: 1px dotted #ddd; cursor: help; }

abbr { text-transform: none; }

/* Blockquotes */
blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #ddd; }
blockquote cite { display: block; font-size: 0.8125em; color: #666; }
blockquote cite:before { content: "\2014 \0020"; }
blockquote cite a, blockquote cite a:visited { color: #666; }

blockquote, blockquote p { line-height: 1.5; color: #999; }

/* Microformats */
.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #ddd; padding: 0.625em 0.75em; }
.vcard li { margin: 0; display: block; }
.vcard .fn { font-weight: bold; font-size: 0.9375em; }

.vevent .summary { font-weight: bold; }
.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; }

@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.25; }
  h1 { font-size: 2.75em; }
  h2 { font-size: 2.3125em; }
  h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; }
  h4 { font-size: 1.4375em; } }
/* Tables */
table { background: #fff; margin-bottom: 1.25em; border: solid 1px rgba(145, 135, 84, 0.15); }
table thead, table tfoot { background: rgba(119, 84, 22, 0.1); font-weight: bold; }
table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: rgba(0, 0, 0, 0.8); text-align: left; }
table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: rgba(0, 0, 0, 0.8); }
table tr.even, table tr.alt, table tr:nth-of-type(even) { background: rgba(119, 84, 22, 0.025); }
table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.5; }

body { tab-size: 4; word-wrap: anywhere; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; }

table { word-wrap: normal; }

h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.25; }

object, svg { display: inline-block; vertical-align: middle; }

.center { margin-left: auto; margin-right: auto; }

.stretch { width: 100%; }

.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; }
.clearfix:after, .float-group:after { clear: both; }

:not(pre).nobreak { word-wrap: normal; }
:not(pre).nowrap { white-space: nowrap; }
:not(pre).pre-wrap { white-space: pre-wrap; }

:not(pre):not([class^=L]) > code { font-size: 1.0625em; font-style: normal !important; letter-spacing: 0; padding: 0; line-height: 1.25; }

pre { color: inherit; font-family: "Liberation Mono", "Consolas", monospace; line-height: 1.4; }
pre code, pre pre { color: inherit; font-size: inherit; line-height: inherit; }
pre > code { display: block; }

pre.nowrap, pre.nowrap pre { white-space: pre; word-wrap: normal; }

em em { font-style: normal; }

strong strong { font-weight: normal; }

.keyseq { color: rgba(51, 51, 51, 0.8); }

kbd { font-family: "Ubuntu Mono", "Inconsolata", monospace; display: inline-block; color: rgba(0, 0, 0, 0.8); font-size: 0.65em; line-height: 1.45; background-color: #f7f7f7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; margin: 0 0.15em; padding: 0.2em 0.5em; vertical-align: middle; position: relative; top: -0.1em; white-space: nowrap; }

.keyseq kbd:first-child { margin-left: 0; }

.keyseq kbd:last-child { margin-right: 0; }

.menuseq, .menuref { color: #000; }

.menuseq b:not(.caret), .menuref { font-weight: inherit; }

.menuseq { word-spacing: -0.02em; }
.menuseq b.caret { font-size: 1.25em; line-height: 0.8; }
.menuseq i.caret { font-weight: bold; text-align: center; width: 0.45em; }

b.button:before, b.button:after { position: relative; top: -1px; font-weight: normal; }

b.button:before { content: "["; padding: 0 3px 0 2px; }

b.button:after { content: "]"; padding: 0 2px 0 3px; }

p a > code:hover { color: #1a0f00; }

#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; }
#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; }
#header:after, #content:after, #footnotes:after, #footer:after { clear: both; }

#content { margin-top: 1.25em; }

#content:before { content: none; }

#header > h1:first-child { color: #703f1c; margin-top: 2.25rem; margin-bottom: 0; }
#header > h1:first-child + #toc { margin-top: 8px; border-top: 1px solid rgba(145, 135, 84, 0.15); }
#header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { border-bottom: 1px solid rgba(145, 135, 84, 0.15); padding-bottom: 8px; }
#header .details { border-bottom: 1px solid rgba(145, 135, 84, 0.15); line-height: 1.45; padding-top: 0.25em; padding-bottom: 0.25em; padding-left: 0.25em; color: #666; display: -ms-flexbox; display: -webkit-flex; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; }
#header .details span:first-child { margin-left: -0.125em; }
#header .details span.email a { color: #999; }
#header .details br { display: none; }
#header .details br + span:before { content: "\00a0\2013\00a0"; }
#header .details br + span.author:before { content: "\00a0\22c5\00a0"; color: #999; }
#header .details br + span#revremark:before { content: "\00a0|\00a0"; }
#header #revnumber { text-transform: capitalize; }
#header #revnumber:after { content: "\00a0"; }

#content > h1:first-child:not([class]) { color: #703f1c; border-bottom: 1px solid rgba(145, 135, 84, 0.15); padding-bottom: 8px; margin-top: 0; padding-top: 1rem; margin-bottom: 1.25rem; }

#toc { border-bottom: 0px solid #ddd; padding-bottom: 0.5em; }
#toc > ul { margin-left: 0.125em; }
#toc ul.sectlevel0 > li > a { font-style: italic; }
#toc ul.sectlevel0 ul.sectlevel1 { margin: 0.5em 0; }
#toc ul { font-family: "Varela Round", sans-serif; list-style-type: none; }
#toc li { line-height: 1.3334; margin-top: 0.3334em; }
#toc a { text-decoration: none; }
#toc a:active { text-decoration: underline; }

#toctitle { color: #002c5e; font-size: 1.2em; }

@media only screen and (min-width: 768px) { #toctitle { font-size: 1.375em; }
  body.toc2 { padding-left: 15em; padding-right: 0; }
  #toc.toc2 { margin-top: 0 !important; background: #f2f2f4; position: fixed; width: 15em; left: 0; top: 0; border-right: 1px solid #ddd; border-top-width: 0 !important; border-bottom-width: 0 !important; z-index: 1000; padding: 1.25em 1em; height: 100%; overflow: auto; }
  #toc.toc2 #toctitle { margin-top: 0; margin-bottom: 0.8rem; font-size: 1.2em; }
  #toc.toc2 > ul { font-size: 0.9em; margin-bottom: 0; }
  #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; }
  #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; }
  body.toc2.toc-right { padding-left: 0; padding-right: 15em; }
  body.toc2.toc-right #toc.toc2 { border-right-width: 0; border-left: 1px solid #ddd; left: auto; right: 0; } }
@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; padding-right: 0; }
  #toc.toc2 { width: 20em; }
  #toc.toc2 #toctitle { font-size: 1.375em; }
  #toc.toc2 > ul { font-size: 0.95em; }
  #toc.toc2 ul ul { padding-left: 1.25em; }
  body.toc2.toc-right { padding-left: 0; padding-right: 20em; } }
#content #toc { border-style: solid; border-width: 1px; border-color: #d6d6dd; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f4; -webkit-border-radius: 6px; border-radius: 6px; }
#content #toc > :first-child { margin-top: 0; }
#content #toc > :last-child { margin-bottom: 0; }

#footer { max-width: none; background: #0b445a; padding: 1.25em; }

#footer-text { color: #fefdfd; line-height: 1.35; }

#content { margin-bottom: 0.625em; }

.sect1 { padding-bottom: 0.625em; }

@media only screen and (min-width: 768px) { #content { margin-bottom: 1.25em; }
  .sect1 { padding-bottom: 1.25em; } }
.sect1:last-child { padding-bottom: 0; }

.sect1 + .sect1 { border-top: 0px solid #ddd; }

#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; z-index: 1001; width: 1.5ex; margin-left: -1.5ex; display: block; text-decoration: none !important; visibility: hidden; text-align: center; font-weight: normal; }
#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: "\00A7"; font-size: 0.85em; display: block; padding-top: 0.1em; }
#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; }
#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: #00326b; text-decoration: none; }
#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #002652; }

details, .audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { margin-bottom: 1.25em; }

details > summary:first-of-type { cursor: pointer; display: list-item; outline: none; margin-bottom: 0.75em; }

.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-rendering: optimizeLegibility; text-align: left; }

table.tableblock.fit-content > caption.title { white-space: nowrap; width: 0; }

.paragraph.lead > p, #preamble > .sectionbody > [class="paragraph"]:first-of-type p { font-size: 1.21875em; line-height: 1.6; color: #703f1c; }

table.tableblock #preamble > .sectionbody > [class="paragraph"]:first-of-type p { font-size: inherit; }

.admonitionblock > table { border-collapse: separate; border: 0; background: none; width: 100%; }
.admonitionblock > table td.icon { text-align: center; width: 80px; }
.admonitionblock > table td.icon img { max-width: none; }
.admonitionblock > table td.icon .title { font-weight: bold; font-family: "Varela Round", sans-serif; text-transform: uppercase; }
.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid rgba(145, 135, 84, 0.15); color: #666; word-wrap: anywhere; }
.admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; }

.exampleblock > .content { border-style: solid; border-width: 1px; border-color: #eddbdb; margin-bottom: 1.25em; padding: 1.25em; background: #fefdfd; -webkit-border-radius: 6px; border-radius: 6px; }
.exampleblock > .content > :first-child { margin-top: 0; }
.exampleblock > .content > :last-child { margin-bottom: 0; }

.sidebarblock { border-style: solid; border-width: 1px; border-color: #d1d1d8; margin-bottom: 1.25em; padding: 1.25em; background: #ececef; -webkit-border-radius: 6px; border-radius: 6px; }
.sidebarblock > :first-child { margin-top: 0; }
.sidebarblock > :last-child { margin-bottom: 0; }
.sidebarblock > .content > .title { color: #002c5e; margin-top: 0; }

.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; }

.literalblock pre, .listingblock > .content > pre { border: 1px solid rgba(16, 195, 196, 0.125); -webkit-border-radius: 6px; border-radius: 6px; overflow-x: auto; padding: 1em; font-size: 0.8125em; }
@media only screen and (min-width: 768px) { .literalblock pre, .listingblock > .content > pre { font-size: 0.90625em; } }
@media only screen and (min-width: 1280px) { .literalblock pre, .listingblock > .content > pre { font-size: 1em; } }

.literalblock pre, .listingblock > .content > pre:not(.highlight), .listingblock > .content > pre[class="highlight"], .listingblock > .content > pre[class^="highlight "] { background: rgba(16, 195, 196, 0.05); }

.literalblock.output pre { color: rgba(16, 195, 196, 0.05); background-color: inherit; }

.listingblock > .content { position: relative; }

.listingblock code[data-lang]:before { display: none; content: attr(data-lang); position: absolute; font-size: 0.75em; top: 0.425rem; right: 0.5rem; line-height: 1; text-transform: uppercase; color: inherit; opacity: 0.5; }

.listingblock:hover code[data-lang]:before { display: block; }

.listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: inherit; opacity: 0.5; }

.listingblock.terminal pre .command:not([data-prompt]):before { content: "$"; }

.listingblock pre.highlightjs { padding: 0; }
.listingblock pre.highlightjs > code { padding: 1em; -webkit-border-radius: 6px; border-radius: 6px; }

.prettyprint { background: rgba(16, 195, 196, 0.05); }

pre.prettyprint .linenums { line-height: 1.4; margin-left: 2em; }

pre.prettyprint li { background: none; list-style-type: inherit; padding-left: 0; }

pre.prettyprint li code[data-lang]:before { opacity: 1; }

pre.prettyprint li:not(:first-child) code[data-lang]:before { display: none; }

table.linenotable { border-collapse: separate; border: 0; margin-bottom: 0; background: none; }
table.linenotable td[class] { color: inherit; vertical-align: top; padding: 0; line-height: inherit; white-space: normal; }
table.linenotable td.code { padding-left: 0.75em; }
table.linenotable td.linenos { border-right: 1px solid currentColor; opacity: 0.35; padding-right: 0.5em; }

pre.pygments .lineno { border-right: 1px solid currentColor; opacity: 0.35; display: inline-block; margin-right: 0.75em; }
pre.pygments .lineno:before { content: ""; margin-right: -0.125em; }

.quoteblock { margin: 0 1em 1.25em 1.5em; display: table; }
.quoteblock:not(.excerpt) > .title { margin-left: -1.5em; margin-bottom: 0.75em; }
.quoteblock blockquote, .quoteblock p { color: #999; font-size: 1.15rem; line-height: 1.75; word-spacing: 0.1em; letter-spacing: 0; font-style: italic; text-align: justify; }
.quoteblock blockquote { margin: 0; padding: 0; border: 0; }
.quoteblock blockquote:before { content: "\201c"; float: left; font-size: 2.75em; font-weight: bold; line-height: 0.6em; margin-left: -0.6em; color: #002c5e; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); }
.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
.quoteblock .attribution { margin-top: 0.75em; margin-right: 0.5ex; text-align: right; }

.verseblock { margin: 0 1em 1.25em 1em; }
.verseblock pre { font-family: "Open Sans", "DejaVu Sans", sans; font-size: 1.15rem; color: #999; font-weight: 300; text-rendering: optimizeLegibility; }
.verseblock pre strong { font-weight: 400; }
.verseblock .attribution { margin-top: 1.25rem; margin-left: 0.5ex; }

.quoteblock .attribution, .verseblock .attribution { font-size: 0.8125em; line-height: 1.45; font-style: italic; }
.quoteblock .attribution br, .verseblock .attribution br { display: none; }
.quoteblock .attribution cite, .verseblock .attribution cite { display: block; letter-spacing: -0.025em; color: #666; }

.quoteblock.abstract blockquote:before, .quoteblock.excerpt blockquote:before, .quoteblock .quoteblock blockquote:before { display: none; }
.quoteblock.abstract blockquote, .quoteblock.abstract p, .quoteblock.excerpt blockquote, .quoteblock.excerpt p, .quoteblock .quoteblock blockquote, .quoteblock .quoteblock p { line-height: 1.6; word-spacing: 0; }
.quoteblock.abstract { margin: 0 1em 1.25em 1em; display: block; }
.quoteblock.abstract > .title { margin: 0 0 0.375em 0; font-size: 1.15em; text-align: center; }
.quoteblock.excerpt > blockquote, .quoteblock .quoteblock { padding: 0 0 0.25em 1em; border-left: 0.25em solid rgba(145, 135, 84, 0.15); }
.quoteblock.excerpt, .quoteblock .quoteblock { margin-left: 0; }
.quoteblock.excerpt blockquote, .quoteblock.excerpt p, .quoteblock .quoteblock blockquote, .quoteblock .quoteblock p { color: inherit; font-size: 1.0625rem; }
.quoteblock.excerpt .attribution, .quoteblock .quoteblock .attribution { color: inherit; text-align: left; margin-right: 0; }

p.tableblock:last-child { margin-bottom: 0; }

td.tableblock > .content { margin-bottom: 1.25em; word-wrap: anywhere; }
td.tableblock > .content > :last-child { margin-bottom: -1.25em; }

table.tableblock, th.tableblock, td.tableblock { border: 0 solid rgba(145, 135, 84, 0.15); }

table.grid-all > * > tr > * { border-width: 1px; }

table.grid-cols > * > tr > * { border-width: 0 1px; }

table.grid-rows > * > tr > * { border-width: 1px 0; }

table.frame-all { border-width: 1px; }

table.frame-ends { border-width: 1px 0; }

table.frame-sides { border-width: 0 1px; }

table.frame-none > colgroup + * > :first-child > *, table.frame-sides > colgroup + * > :first-child > * { border-top-width: 0; }

table.frame-none > :last-child > :last-child > *, table.frame-sides > :last-child > :last-child > * { border-bottom-width: 0; }

table.frame-none > * > tr > :first-child, table.frame-ends > * > tr > :first-child { border-left-width: 0; }

table.frame-none > * > tr > :last-child, table.frame-ends > * > tr > :last-child { border-right-width: 0; }

table.stripes-all tr, table.stripes-odd tr:nth-of-type(odd), table.stripes-even tr:nth-of-type(even), table.stripes-hover tr:hover { background: rgba(119, 84, 22, 0.025); }

th.halign-left, td.halign-left { text-align: left; }

th.halign-right, td.halign-right { text-align: right; }

th.halign-center, td.halign-center { text-align: center; }

th.valign-top, td.valign-top { vertical-align: top; }

th.valign-bottom, td.valign-bottom { vertical-align: bottom; }

th.valign-middle, td.valign-middle { vertical-align: middle; }

table thead th, table tfoot th { font-weight: bold; }

tbody tr th { display: table-cell; line-height: 1.5; background: rgba(119, 84, 22, 0.1); }

tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: rgba(0, 0, 0, 0.8); font-weight: bold; }

p.tableblock > code:only-child { background: none; padding: 0; }

p.tableblock { font-size: 1em; }

ol { margin-left: 1.75em; }

ul li ol { margin-left: 1.5em; }

dl dd { margin-left: 1.125em; }

dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; }

ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.625em; }

ul.checklist, ul.none, ol.none, ul.no-bullet, ol.no-bullet, ol.unnumbered, ul.unstyled, ol.unstyled { list-style-type: none; }

ul.no-bullet, ol.no-bullet, ol.unnumbered { margin-left: 0.625em; }

ul.unstyled, ol.unstyled { margin-left: 0; }

ul.checklist { margin-left: 0.625em; }

ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { width: 1.25em; font-size: 0.8em; position: relative; bottom: 0.125em; }

ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; }

ul.inline { display: -ms-flexbox; display: -webkit-box; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; list-style: none; margin: 0 0 0.625em -1.25em; }

ul.inline > li { margin-left: 1.25em; }

.unstyled dl dt { font-weight: normal; font-style: normal; }

ol.arabic { list-style-type: decimal; }

ol.decimal { list-style-type: decimal-leading-zero; }

ol.loweralpha { list-style-type: lower-alpha; }

ol.upperalpha { list-style-type: upper-alpha; }

ol.lowerroman { list-style-type: lower-roman; }

ol.upperroman { list-style-type: upper-roman; }

ol.lowergreek { list-style-type: lower-greek; }

.hdlist > table, .colist > table { border: 0; background: none; }
.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; }

td.hdlist1, td.hdlist2 { vertical-align: top; padding: 0 0.625em; }

td.hdlist1 { font-weight: bold; padding-bottom: 1.25em; }

td.hdlist2 { word-wrap: anywhere; }

.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }

.colist td:not([class]):first-child { padding: 0.4em 0.75em 0 0.75em; line-height: 1; vertical-align: top; }
.colist td:not([class]):first-child img { max-width: none; }
.colist td:not([class]):last-child { padding: 0.25em 0; }

.thumb, .th { line-height: 0; display: inline-block; border: solid 4px #fff; -webkit-box-shadow: 0 0 0 1px #ddd; box-shadow: 0 0 0 1px #ddd; }

.imageblock.left { margin: 0.25em 0.625em 1.25em 0; }
.imageblock.right { margin: 0.25em 0 1.25em 0.625em; }
.imageblock > .title { margin-bottom: 0; }
.imageblock.thumb, .imageblock.th { border-width: 6px; }
.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; }

.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; }
.image.left { margin-right: 0.625em; }
.image.right { margin-left: 0.625em; }

a.image { text-decoration: none; display: inline-block; }
a.image object { pointer-events: none; }

sup.footnote, sup.footnoteref { font-size: 0.875em; position: static; vertical-align: super; }
sup.footnote a, sup.footnoteref a { text-decoration: none; }
sup.footnote a:active, sup.footnoteref a:active { text-decoration: underline; }

#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; }
#footnotes hr { width: 20%; min-width: 6.25em; margin: -0.25em 0 0.75em 0; border-width: 1px 0 0 0; }
#footnotes .footnote { padding: 0 0.375em 0 0.225em; line-height: 1.3334; font-size: 0.875em; margin-left: 1.2em; margin-bottom: 0.2em; }
#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; margin-left: -1.05em; }
#footnotes .footnote:last-of-type { margin-bottom: 0; }
#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; }

.gist .file-data > table { border: 0; background: #fff; width: 100%; margin-bottom: 0; }
.gist .file-data > table td.line-data { width: 99%; }

div.unbreakable { page-break-inside: avoid; }

.big { font-size: larger; }

.small { font-size: smaller; }

.underline { text-decoration: underline; }

.overline { text-decoration: overline; }

.line-through { text-decoration: line-through; }

.aqua { color: #00bfbf; }

.aqua-background { background-color: #00fafa; }

.black { color: black; }

.black-background { background-color: black; }

.blue { color: #0000bf; }

.blue-background { background-color: #0000fa; }

.fuchsia { color: #bf00bf; }

.fuchsia-background { background-color: #fa00fa; }

.gray { color: #606060; }

.gray-background { background-color: #7d7d7d; }

.green { color: #006000; }

.green-background { background-color: #007d00; }

.lime { color: #00bf00; }

.lime-background { background-color: #00fa00; }

.maroon { color: #600000; }

.maroon-background { background-color: #7d0000; }

.navy { color: #000060; }

.navy-background { background-color: #00007d; }

.olive { color: #606000; }

.olive-background { background-color: #7d7d00; }

.purple { color: #600060; }

.purple-background { background-color: #7d007d; }

.red { color: #bf0000; }

.red-background { background-color: #fa0000; }

.silver { color: #909090; }

.silver-background { background-color: #bcbcbc; }

.teal { color: #006060; }

.teal-background { background-color: #007d7d; }

.white { color: #bfbfbf; }

.white-background { background-color: #fafafa; }

.yellow { color: #bfbf00; }

.yellow-background { background-color: #fafa00; }

span.icon > .fa { cursor: default; }
a span.icon > .fa { cursor: inherit; }

.admonitionblock td.icon [class^="fa icon-"] { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #004060; }
.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; }
.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; }
.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; }
.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; }

.conum[data-value] { display: inline-block; color: #fff !important; background-color: rgba(0, 0, 0, 0.8); -webkit-border-radius: 50%; border-radius: 50%; text-align: center; font-size: 0.75em; width: 1.67em; height: 1.67em; line-height: 1.67em; font-family: "Open Sans", "DejaVu Sans", sans-serif; font-style: normal; font-weight: bold; }
.conum[data-value] * { color: #fff !important; }
.conum[data-value] + b { display: none; }
.conum[data-value]:after { content: attr(data-value); }
pre .conum[data-value] { position: relative; top: -0.125em; }

b.conum * { color: inherit !important; }

.conum:not([data-value]):empty { display: none; }

#toc.toc2 ul ul { list-style-type: circle; padding-left: 2em; }

.sect1 { padding-bottom: 0 !important; margin-bottom: 2.5em; }

#header h1 { font-weight: bold; position: relative; left: -0.0625em; }

#content h2, #content h3, #content #toctitle, #content .sidebarblock > .content > .title, #content h4, #content h5, #content #toctitle { position: relative; left: -0.0625em; }
#content h2 { font-weight: bold; }

.paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { color: black; }

pre.pygments.highlight { background-color: rgba(16, 195, 196, 0.05); }

.pygments .tok-err { border: none !important; color: #800000 !important; }

.pygments .tok-c { color: #999 !important; }

</style>
<style>
pre.rouge table td { padding: 5px; }
pre.rouge table pre { margin: 0; }
pre.rouge, pre.rouge .w {
  color: #586e75;
}
pre.rouge .err {
  color: #002b36;
  background-color: #dc322f;
}
pre.rouge .c, pre.rouge .ch, pre.rouge .cd, pre.rouge .cm, pre.rouge .cpf, pre.rouge .c1, pre.rouge .cs {
  color: #657b83;
}
pre.rouge .cp {
  color: #b58900;
}
pre.rouge .nt {
  color: #b58900;
}
pre.rouge .o, pre.rouge .ow {
  color: #93a1a1;
}
pre.rouge .p, pre.rouge .pi {
  color: #93a1a1;
}
pre.rouge .gi {
  color: #859900;
}
pre.rouge .gd {
  color: #dc322f;
}
pre.rouge .gh {
  color: #268bd2;
  background-color: #002b36;
  font-weight: bold;
}
pre.rouge .k, pre.rouge .kn, pre.rouge .kp, pre.rouge .kr, pre.rouge .kv {
  color: #6c71c4;
}
pre.rouge .kc {
  color: #cb4b16;
}
pre.rouge .kt {
  color: #cb4b16;
}
pre.rouge .kd {
  color: #cb4b16;
}
pre.rouge .s, pre.rouge .sb, pre.rouge .sc, pre.rouge .dl, pre.rouge .sd, pre.rouge .s2, pre.rouge .sh, pre.rouge .sx, pre.rouge .s1 {
  color: #859900;
}
pre.rouge .sa {
  color: #6c71c4;
}
pre.rouge .sr {
  color: #2aa198;
}
pre.rouge .si {
  color: #d33682;
}
pre.rouge .se {
  color: #d33682;
}
pre.rouge .nn {
  color: #b58900;
}
pre.rouge .nc {
  color: #b58900;
}
pre.rouge .no {
  color: #b58900;
}
pre.rouge .na {
  color: #268bd2;
}
pre.rouge .m, pre.rouge .mb, pre.rouge .mf, pre.rouge .mh, pre.rouge .mi, pre.rouge .il, pre.rouge .mo, pre.rouge .mx {
  color: #859900;
}
pre.rouge .ss {
  color: #859900;
}
</style>
</head>
<body class="article toc2 toc-left">
<div id="header">
<h1>Debugging Support</h1>
<div class="details">
<span id="author" class="author">René Ferdinand Rivera Morell</span><br>
<span id="email" class="email"><a href="mailto:grafikrobot@gmail.com">grafikrobot@gmail.com</a></span><br>
<span id="revnumber"> P2546R5,</span>
<span id="revdate">2023-07-05</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_abstract">1. Abstract</a></li>
<li><a href="#_revision_history">2. Revision History</a>
<ul class="sectlevel2">
<li><a href="#_revision_5_june_2023">2.1. Revision 5 (June 2023)</a></li>
<li><a href="#_revision_4_february_2023">2.2. Revision 4 (February 2023)</a></li>
<li><a href="#_revision_3_november_2022">2.3. Revision 3 (November 2022)</a></li>
<li><a href="#_revision_2_october_2022">2.4. Revision 2 (October 2022)</a></li>
<li><a href="#_revision_1_april_2022">2.5. Revision 1 (April 2022)</a></li>
<li><a href="#_revision_0_february_2022">2.6. Revision 0 (February 2022)</a></li>
</ul>
</li>
<li><a href="#_motivation">3. Motivation</a>
<ul class="sectlevel2">
<li><a href="#_is_debugger_present">3.1. Is Debugger Present</a></li>
<li><a href="#_breakpoint">3.2. Breakpoint</a></li>
</ul>
</li>
<li><a href="#_design">4. Design</a>
<ul class="sectlevel2">
<li><a href="#_unconditional_breakpoint">4.1. Unconditional Breakpoint</a></li>
<li><a href="#_conditional_breakpoint">4.2. Conditional Breakpoint</a></li>
<li><a href="#_debugger_present">4.3. Debugger Present</a></li>
<li><a href="#_hosted_and_freestanding">4.4. Hosted and Freestanding</a></li>
<li><a href="#_impact_on_the_standard">4.5. Impact On the Standard</a></li>
</ul>
</li>
<li><a href="#_implementation_experience">5. Implementation Experience</a>
<ul class="sectlevel2">
<li><a href="#_reference_implementation">5.1. Reference Implementation</a></li>
<li><a href="#_microsoft_cc_optimizing_compiler">5.2. Microsoft&#174; C/C&#43;&#43; Optimizing Compiler</a></li>
<li><a href="#_microsoft_win32">5.3. Microsoft&#174; Win32</a></li>
<li><a href="#_llvm_clang">5.4. LLVM Clang</a></li>
<li><a href="#_arm_keil_arm_compiler">5.5. arm Keil, ARM&#174; Compiler</a></li>
<li><a href="#_portable_snippets">5.6. Portable Snippets</a></li>
<li><a href="#_debug_break">5.7. Debug Break</a></li>
<li><a href="#_boost_test">5.8. Boost.Test</a></li>
<li><a href="#_eastl">5.9. EASTL</a></li>
<li><a href="#_catch2">5.10. Catch2</a></li>
<li><a href="#_juce">5.11. JUCE</a></li>
<li><a href="#_dear_imgui">5.12. Dear ImGui</a></li>
<li><a href="#_aws_c_sdk">5.13. AWS C SDK</a></li>
<li><a href="#_unreal_engine">5.14. Unreal&#174; Engine</a></li>
</ul>
</li>
<li><a href="#_polls">6. Polls</a>
<ul class="sectlevel2">
<li><a href="#_lwg_p2546r5_2023_07_05">6.1. LWG: P2546R5 (2023-07-05)</a></li>
<li><a href="#_lewg_p2546r3_2023_06_16">6.2. LEWG: P2546R3 (2023-06-16)</a></li>
<li><a href="#_lewg_p2546r3_2023_02_09">6.3. LEWG: P2546R3 (2023-02-09)</a></li>
<li><a href="#_ewg_p2546r2_2022_11_08">6.4. EWG: P2546R2 (2022-11-08)</a></li>
<li><a href="#_sg15_p2546_2022_02_18">6.5. SG15: P2546 (2022-02-18)</a></li>
<li><a href="#_sg15_p2514r0_and_p2515r0_2022_01_21">6.6. SG15: P2514R0 and P2515R0 (2022-01-21)</a></li>
</ul>
</li>
<li><a href="#_wording">7. Wording</a>
<ul class="sectlevel2">
<li><a href="#_feature_test_macro">7.1. Feature Test Macro</a></li>
<li><a href="#_library">7.2. Library</a></li>
</ul>
</li>
<li><a href="#_acknowledgements">8. Acknowledgements</a></li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<style>
.sectionbody > div > .ins {
  border-left: solid 0.4em green;
  padding-left: 1em;
  text-decoration: underline solid green;
  text-underline-offset: 0.3em;
}
.def > .content :first-child {
  margin-left: 0;
}
.def > .content > * {
  margin-left: 3em;
}
.icon .title {
  font-size: 250%;
}
</style>
<div class="dlist">
<dl>
<dt class="hdlist1">Document number: </dt>
<dd>
<p>ISO/IEC/JTC1/SC22/WG21/P2546R5</p>
</dd>
<dt class="hdlist1">Date: </dt>
<dd>
<p>2023-07-05</p>
</dd>
<dt class="hdlist1">Audience: </dt>
<dd>
<p>LWG</p>
</dd>
<dt class="hdlist1">Reply-to: </dt>
<dd>
<p>René Ferdinand Rivera Morell, <a href="mailto:grafikrobot@gmail.com">grafikrobot@gmail.com</a></p>
</dd>
<dt class="hdlist1">Project: </dt>
<dd>
<p>ISO/IEC JTC1/SC22/WG21 14882: Programming Language — C&#43;&#43;</p>
</dd>
</dl>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_abstract"><a class="anchor" href="#_abstract"></a>1. Abstract</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This paper proposes to add utilities to aid in interacting with debugging
tools.</p>
</div>
<div class="paragraph">
<p>This is a merger, and successor, to P2514 and P2515.
<sup class="footnote" id="_footnote_P2514">[<a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup>
<sup class="footnote" id="_footnote_P2515">[<a id="_footnoteref_2" class="footnote" href="#_footnotedef_2" title="View footnote.">2</a>]</sup>
Of which P2514 is a successor to P1279.
<sup class="footnote" id="_footnote_P1279">[<a id="_footnoteref_3" class="footnote" href="#_footnotedef_3" title="View footnote.">3</a>]</sup></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_revision_history"><a class="anchor" href="#_revision_history"></a>2. Revision History</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_revision_5_june_2023"><a class="anchor" href="#_revision_5_june_2023"></a>2.1. Revision 5 (June 2023)</h3>
<div class="ulist">
<ul>
<li>
<p>Wording fixes from LWG.</p>
</li>
<li>
<p>Add ePoll results.</p>
</li>
<li>
<p>Add LWG forwarding poll.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_revision_4_february_2023"><a class="anchor" href="#_revision_4_february_2023"></a>2.2. Revision 4 (February 2023)</h3>
<div class="ulist">
<ul>
<li>
<p>Add LEWG poll results.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_revision_3_november_2022"><a class="anchor" href="#_revision_3_november_2022"></a>2.3. Revision 3 (November 2022)</h3>
<div class="ulist">
<ul>
<li>
<p>Fix spelling error in wording.</p>
</li>
<li>
<p>Add EWG poll results.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_revision_2_october_2022"><a class="anchor" href="#_revision_2_october_2022"></a>2.4. Revision 2 (October 2022)</h3>
<div class="ulist">
<ul>
<li>
<p>Add freestanding comment to wording per Ben Craig&#8217;s feedback.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_revision_1_april_2022"><a class="anchor" href="#_revision_1_april_2022"></a>2.5. Revision 1 (April 2022)</h3>
<div class="ulist">
<ul>
<li>
<p>Remove suggested do nothing breakpoint implementation comments per SG15
feedback.</p>
</li>
<li>
<p>Add poll results from SG15.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_revision_0_february_2022"><a class="anchor" href="#_revision_0_february_2022"></a>2.6. Revision 0 (February 2022)</h3>
<div class="paragraph">
<p>Initial text based on P2514 and P2515. <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup> <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_2" title="View footnote.">2</a>]</sup>
Changes include:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Merged into one proposal with <code>breakpoint</code> and <code>is_debugger_present</code>.</p>
</li>
<li>
<p>Change <code>breakpoint</code> to be unconditional.</p>
</li>
<li>
<p>Added <code>breakpoint_if_debugging</code> as a conditional break.</p>
</li>
<li>
<p>Added feature test macro.</p>
</li>
<li>
<p>Expanded implementation experience with explanations of usage context.</p>
</li>
<li>
<p>Changed <code>is_debugger_present</code> description to say that it should be an
immediate query.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_motivation"><a class="anchor" href="#_motivation"></a>3. Motivation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>There are many scenarios where doing something special when your program is
running in a debugger is important. At times interacting with the debugger
programmatically can help enhance the debugging experience when the debugger
on its own is lacking.</p>
</div>
<div class="paragraph">
<p>Implementation experience has shown that: this is a desired set of features as
it&#8217;s implemented in many different code bases, it is difficult to implement
the functionality correctly for users without deep platform knowledge. Hence
the C++ community would benefit from having this implemented by the platform
owners in the standard.</p>
</div>
<div class="sect2">
<h3 id="_is_debugger_present"><a class="anchor" href="#_is_debugger_present"></a>3.1. Is Debugger Present</h3>
<div class="paragraph">
<p>Knowing when a program is running in a debugger with <code>std::is_debugger_present</code>
is a first step in enabling such functionality as:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>allowing printing out extra output to help diagnose problems,</p>
</li>
<li>
<p>executing extra test code,</p>
</li>
<li>
<p>displaying an extra user interface to help in debugging,</p>
</li>
<li>
<p>and more.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_breakpoint"><a class="anchor" href="#_breakpoint"></a>3.2. Breakpoint</h3>
<div class="paragraph">
<p>Controlling when a debugger stops in your program with <code>std::breakpoint</code> allows
for runtime control of breakpoints beyond what might be available from a
debugger while not causing the program to exit. For example:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>breaking when an infrequent non-critical condition is detected,</p>
</li>
<li>
<p>allowing programmatic control with complex runtime sensitive conditions,</p>
</li>
<li>
<p>breaking on user input to inspect context in interactive programs without
needing to switch to the debugger application,</p>
</li>
<li>
<p>and more.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_design"><a class="anchor" href="#_design"></a>4. Design</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_unconditional_breakpoint"><a class="anchor" href="#_unconditional_breakpoint"></a>4.1. Unconditional Breakpoint</h3>
<div class="paragraph">
<p>The goal of the <code>std::breakpoint</code> function is to "break" or pause the running
program when called. Having an unconditional, i.e. attempts to break even if
the debugger is or is not actually monitoring the program allows for use in
conditions where it is not possible to detect if a debugger is present.</p>
</div>
<div class="paragraph">
<p>Implementations are expected to optimize the code generated to be as minimal
as possible for the platform. For example, on X86 it&#8217;s expected that this
produces a single <code>INT3</code> instruction. The goal in this expectation is to place
the debugger as close as possible in the caller of <code>breakpoint()</code> to
improve the debugging experience for users.</p>
</div>
</div>
<div class="sect2">
<h3 id="_conditional_breakpoint"><a class="anchor" href="#_conditional_breakpoint"></a>4.2. Conditional Breakpoint</h3>
<div class="paragraph">
<p>The goal of the <code>std::breakpoint_if_debugging</code> function is to "break" when
being debugged but to act as though it is a no-op when it is executing
normally.</p>
</div>
<div class="paragraph">
<p>Although it&#8217;s trivial for users to implement a conditional break, it&#8217;s
common enough that there is utility in providing a ready to use implementation.</p>
</div>
</div>
<div class="sect2">
<h3 id="_debugger_present"><a class="anchor" href="#_debugger_present"></a>4.3. Debugger Present</h3>
<div class="paragraph">
<p>The goal of the <code>std::is_debugger_present</code> function is to inform when a program
is executing under the control of a debugger monitoring program. The interface
is minimally simple to avoid having to reduce the user from having to know the
intricacies of debugger operation. This is a feature that requires arcane
platform knowledge for most platforms. But it is knowledge that is readily
available to the platform tooling implementors.</p>
</div>
<div class="paragraph">
<p>Existing implementations of this functionality vary in how frequently they are
expected to be called. Previously the proposal suggested that it would help
to cache the debugger present query to avoid frequent repetition of the
possible expensive query. But, first, doing that was not found to be done
in any of the existing implementations. Second, doing so would add to the
implementation complexity for something that can be better controlled by the
user code. And, third, it would impact the <code>std::breakpoint_if_debugging</code>
function to need to forward the argument to pass along to control the
caching choice.</p>
</div>
</div>
<div class="sect2">
<h3 id="_hosted_and_freestanding"><a class="anchor" href="#_hosted_and_freestanding"></a>4.4. Hosted and Freestanding</h3>
<div class="paragraph">
<p>The debugging support functionality is particularly useful in situations where
it&#8217;s difficult to debug in traditional hosted context. For example when the
debugger is running on a development host machine while the program is running
on specialize freestanding environment. In such situations it can be impossible
to determine if a debugger is present remotely, and almost certainly unlikely
that a debugger can run in the target environment. As such the debugger support
in this proposal is expected to be supported, as best as possible, in
freestanding environments. The wording reflects that by having maximum
flexibility in implementation.</p>
</div>
</div>
<div class="sect2">
<h3 id="_impact_on_the_standard"><a class="anchor" href="#_impact_on_the_standard"></a>4.5. Impact On the Standard</h3>
<div class="paragraph">
<p>This proposal adds a utility header (<code>debugging</code>) with the new declarations.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_implementation_experience"><a class="anchor" href="#_implementation_experience"></a>5. Implementation Experience</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_reference_implementation"><a class="anchor" href="#_reference_implementation"></a>5.1. Reference Implementation</h3>
<div class="paragraph">
<p>A full reference implementation exists as a proof of concept.
<sup class="footnote" id="_footnote_refimp">[<a id="_footnoteref_4" class="footnote" href="#_footnotedef_4" title="View footnote.">4</a>]</sup>
It implements the full functionality for at least Windows, macOS, and Linux.</p>
</div>
<div class="paragraph">
<p>In addition to the prototype implementation there are the following, full or
partial, equivalent implementations of the functions in common compilers and
libraries.</p>
</div>
</div>
<div class="sect2">
<h3 id="_microsoft_cc_optimizing_compiler"><a class="anchor" href="#_microsoft_cc_optimizing_compiler"></a>5.2. Microsoft&#174; C/C&#43;&#43; Optimizing Compiler</h3>
<div class="paragraph">
<p>The Microsoft&#174; compiler provides a <code>__debugbreak</code> function that implements
an unconditional break.
<sup class="footnote">[<a id="_footnoteref_5" class="footnote" href="#_footnotedef_5" title="View footnote.">5</a>]</sup></p>
</div>
</div>
<div class="sect2">
<h3 id="_microsoft_win32"><a class="anchor" href="#_microsoft_win32"></a>5.3. Microsoft&#174; Win32</h3>
<div class="paragraph">
<p>The Windows&#174; Win32 provides an <code>IsDebuggerPresent</code> function in the OS that
implements querying if a debugger is tracing the calling process.
<sup class="footnote">[<a id="_footnoteref_6" class="footnote" href="#_footnotedef_6" title="View footnote.">6</a>]</sup></p>
</div>
</div>
<div class="sect2">
<h3 id="_llvm_clang"><a class="anchor" href="#_llvm_clang"></a>5.4. LLVM Clang</h3>
<div class="paragraph">
<p>Clang provides a <code>__builtin_debugtrap</code> function that implements an
unconditional break.
<sup class="footnote">[<a id="_footnoteref_7" class="footnote" href="#_footnotedef_7" title="View footnote.">7</a>]</sup></p>
</div>
</div>
<div class="sect2">
<h3 id="_arm_keil_arm_compiler"><a class="anchor" href="#_arm_keil_arm_compiler"></a>5.5. arm Keil, ARM&#174; Compiler</h3>
<div class="paragraph">
<p>The arm Keil armcc compiler provides a <code>__breakpoint</code> function that
implements an unconditional break.
<sup class="footnote">[<a id="_footnoteref_8" class="footnote" href="#_footnotedef_8" title="View footnote.">8</a>]</sup></p>
</div>
</div>
<div class="sect2">
<h3 id="_portable_snippets"><a class="anchor" href="#_portable_snippets"></a>5.6. Portable Snippets</h3>
<div class="paragraph">
<p>The "Portable Snippets" library
<sup class="footnote">[<a id="_footnoteref_9" class="footnote" href="#_footnotedef_9" title="View footnote.">9</a>]</sup>
includes a <code>psnip_trap</code> function that implements an unconditional breakpoint in
a variety of platforms and architectures.
<sup class="footnote">[<a id="_footnoteref_10" class="footnote" href="#_footnotedef_10" title="View footnote.">10</a>]</sup></p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">ℹ</div>
</td>
<td class="content">
The reference implementation <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_4" title="View footnote.">4</a>]</sup> uses <code>psnip_trap</code> to
implement the unconditional <code>breakpoint</code> function.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_debug_break"><a class="anchor" href="#_debug_break"></a>5.7. Debug Break</h3>
<div class="paragraph">
<p>The "Debug Break" library provides a single <code>debug_break</code> function that
attempts to implement an unconditional debugger break.
<sup class="footnote">[<a id="_footnoteref_11" class="footnote" href="#_footnotedef_11" title="View footnote.">11</a>]</sup></p>
</div>
</div>
<div class="sect2">
<h3 id="_boost_test"><a class="anchor" href="#_boost_test"></a>5.8. Boost.Test</h3>
<div class="paragraph">
<p>The Boost.Test library implements an unconditional break in a <code>debugger_break</code>
function.
<sup class="footnote">[<a id="_footnoteref_12" class="footnote" href="#_footnotedef_12" title="View footnote.">12</a>]</sup>
 And provides an <code>under_debugger</code> function that implements an immediate
<code>is_debugger_present</code> function for Windows&#174;, UNIX&#174;, and macOS&#174;.
<sup class="footnote">[<a id="_footnoteref_13" class="footnote" href="#_footnotedef_13" title="View footnote.">13</a>]</sup></p>
</div>
<div class="paragraph">
<p>The two functions are used to implement an <code>attach_debugger(bool)</code> function
that programmatically runs a debugger to trace the running program.
<sup class="footnote">[<a id="_footnoteref_14" class="footnote" href="#_footnotedef_14" title="View footnote.">14</a>]</sup></p>
</div>
</div>
<div class="sect2">
<h3 id="_eastl"><a class="anchor" href="#_eastl"></a>5.9. EASTL</h3>
<div class="paragraph">
<p>The EASTL library provides a <code>EASTL_DEBUG_BREAK()</code> macro that implements an
unconditional <code>breakpoint</code>.
<sup class="footnote">[<a id="_footnoteref_15" class="footnote" href="#_footnotedef_15" title="View footnote.">15</a>]</sup></p>
</div>
<div class="paragraph">
<p>The <code>EASTL_DEBUG_BREAK()</code> macro is used to implement breaking into the debugger
on failure in the <code>EASTL_ASSERT(expression)</code> macro.</p>
</div>
</div>
<div class="sect2">
<h3 id="_catch2"><a class="anchor" href="#_catch2"></a>5.10. Catch2</h3>
<div class="paragraph">
<p>The Catch2 library implements an internal and immediate <code>isDebuggerActive</code>
function equivalent to <code>is_debugger_present</code> for macOS&#174; and Linux.
<sup class="footnote">[<a id="_footnoteref_16" class="footnote" href="#_footnotedef_16" title="View footnote.">16</a>]</sup>
 It also provides a <code>CATCH_TRAP</code> macro that implements an unconditional
<code>breakpoint</code> and a <code>CATCH_BREAK_INTO_DEBUGGER</code> macro that implements a
conditional break per <code>breakpoint_if_debugging</code>.
<sup class="footnote">[<a id="_footnoteref_17" class="footnote" href="#_footnotedef_17" title="View footnote.">17</a>]</sup></p>
</div>
<div class="paragraph">
<p>The <code>CATCH_BREAK_INTO_DEBUGGER</code> macro is used to cause failed assertions to
pause in the debugger, if present. In addition to <code>isDebuggerActive</code> being
used to implement the <code>CATCH_BREAK_INTO_DEBUGGER</code> macro, it&#8217;s also used to
enable console text color output.</p>
</div>
</div>
<div class="sect2">
<h3 id="_juce"><a class="anchor" href="#_juce"></a>5.11. JUCE</h3>
<div class="paragraph">
<p>The JUCE open-source cross-platform C++ application framework provides a
<code>juce_isRunningUnderDebugger</code> function that implements an immediate
<code>is_debugger_present</code>.
<sup class="footnote">[<a id="_footnoteref_18" class="footnote" href="#_footnotedef_18" title="View footnote.">18</a>]</sup>
 It also provides a <code>JUCE_BREAK_IN_DEBUGGER</code> macro that implements an
unconditional break.
<sup class="footnote">[<a id="_footnoteref_19" class="footnote" href="#_footnotedef_19" title="View footnote.">19</a>]</sup></p>
</div>
<div class="paragraph">
<p>In JUCE the two are used implement a conditional breakpoint when an assertion
fails in the provided <code>jassert</code> and <code>jassertquiet</code>. The user perceived feature
is the ability to write assert checks that can be inspected in context when
running in a debugger.</p>
</div>
<div class="paragraph">
<p>The <code>juce_isRunningUnderDebugger</code> function is also made available as a
<code>Process::isRunningUnderDebugger</code> method. Making it available to JUCE users
in their applications to support user specific features.</p>
</div>
</div>
<div class="sect2">
<h3 id="_dear_imgui"><a class="anchor" href="#_dear_imgui"></a>5.12. Dear ImGui</h3>
<div class="paragraph">
<p>Dear ImGui provides an <code>IM_DEBUG_BREAK()</code> macro that implements an unconditional
breakpoint.
<sup class="footnote">[<a id="_footnoteref_20" class="footnote" href="#_footnotedef_20" title="View footnote.">20</a>]</sup></p>
</div>
<div class="paragraph">
<p>In addition to being available for users, the <code>IM_DEBUG_BREAK()</code> macro is used
to provide a GUI button that will break into the debugger on demand.</p>
</div>
</div>
<div class="sect2">
<h3 id="_aws_c_sdk"><a class="anchor" href="#_aws_c_sdk"></a>5.13. AWS C SDK</h3>
<div class="paragraph">
<p>The Amazon Web Services SDK for C provides a <code>aws_is_debugger_present</code> function
which implements an immediate <code>is_debugger_present</code>.
<sup class="footnote">[<a id="_footnoteref_21" class="footnote" href="#_footnotedef_21" title="View footnote.">21</a>]</sup>
 And also provides a <code>aws_debug_break</code> function that implements a conditional
break, i.e. <code>breakpoint_if_debugging</code>.
<sup class="footnote">[<a id="_footnoteref_22" class="footnote" href="#_footnotedef_22" title="View footnote.">22</a>]</sup></p>
</div>
<div class="paragraph">
<p>The implementation is of these functions have platform support for Windows and
POSIX.</p>
</div>
<div class="paragraph">
<p>The <code>aws_debug_break</code> function is used to implement the <code>aws_fatal_assert</code>
function. Which in addition to conditionally breaking into the debugger
also prints out the assertion info and backtrace. Which in turn is used in
the <code>AWS_FATAL_ASSERT</code> macro.</p>
</div>
</div>
<div class="sect2">
<h3 id="_unreal_engine"><a class="anchor" href="#_unreal_engine"></a>5.14. Unreal&#174; Engine</h3>
<div class="paragraph">
<p>Unreal&#174; Engine
<sup class="footnote">[<a id="_footnoteref_23" class="footnote" href="#_footnotedef_23" title="View footnote.">23</a>]</sup>
 is a full blown game development environment composed of an IDE
and more than a dozen different programs written using a common application
framework. The engine provides an <code>IsDebuggerPresent</code> class function that
implements an immediate <code>is_debugger_present</code>.</p>
</div>
<div class="paragraph">
<p>Unreal&#174; Engine provides an implementation of the <code>IsDebuggerPresent</code> function
in common platforms like Windows, macOS, Linux/POSIX, and Android. It also
has implementations for a handful proprietary platforms like game consoles
and virtual reality headsets.</p>
</div>
<div class="paragraph">
<p>Unreal&#174; Engine also provides a <code>UE_DEBUG_BREAK</code> macro that implements a
conditional break. Like the <code>IsDebuggerPresent</code> function this conditional
break is implemented in many of the same platforms. The <code>UE_DEBUG_BREAK</code> macro
uses <code>IsDebuggerPresent</code> to do the debugger conditional check.</p>
</div>
<div class="paragraph">
<p>The <code>IsDebuggerPresent</code> function has varied uses in Unreal&#174; Engine:
to log extra diagnostic output when certain inspection functions are called,
to choose doing a debug break when present or to print out a stack trace instead,
to prevent launching child parallel processes to allow debugging of normally
distributed tasks, to disable auto-save on crash functionality, to turn off
platform crash handling, to implement "wait for debugger" synchronization
points, to add extra per thread context information to aid in finding task
specific threads among the dozens of threads running, to prevent automated
crash reporting, and to present GUI elements only when debugging.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_polls"><a class="anchor" href="#_polls"></a>6. Polls</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_lwg_p2546r5_2023_07_05"><a class="anchor" href="#_lwg_p2546r5_2023_07_05"></a>6.1. LWG: P2546R5 (2023-07-05)</h3>
<div class="paragraph">
<p>Put P2546R5 (to be checked by JW and JG) into C++26?</p>
</div>
<table class="tableblock frame-all grid-all fit-content">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">F</th>
<th class="tableblock halign-center valign-top">A</th>
<th class="tableblock halign-center valign-top">N</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">8</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_lewg_p2546r3_2023_06_16"><a class="anchor" href="#_lewg_p2546r3_2023_06_16"></a>6.2. LEWG: P2546R3 (2023-06-16)</h3>
<div class="paragraph">
<p>Poll 4: Send [P2546R3] Debugging Support to Library Working Group for C&#43;&#43;26.
<sup class="footnote">[<a id="_footnoteref_24" class="footnote" href="#_footnotedef_24" title="View footnote.">24</a>]</sup></p>
</div>
<table class="tableblock frame-all grid-all fit-content">
<colgroup>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">SF</th>
<th class="tableblock halign-center valign-top">WF</th>
<th class="tableblock halign-center valign-top">N</th>
<th class="tableblock halign-center valign-top">WA</th>
<th class="tableblock halign-center valign-top">SA</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">13</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">7</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">1</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_lewg_p2546r3_2023_02_09"><a class="anchor" href="#_lewg_p2546r3_2023_02_09"></a>6.3. LEWG: P2546R3 (2023-02-09)</h3>
<div class="paragraph">
<p>is_debugger_present should be in freestanding.</p>
</div>
<table class="tableblock frame-all grid-all fit-content">
<colgroup>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">SF</th>
<th class="tableblock halign-center valign-top">WF</th>
<th class="tableblock halign-center valign-top">N</th>
<th class="tableblock halign-center valign-top">WA</th>
<th class="tableblock halign-center valign-top">SA</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">6</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">10</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">2</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p><em>Attendance:</em> 22 (In-person) + 13 (Remote)</p>
</div>
<div class="paragraph">
<p><em># of Authors:</em> 1</p>
</div>
<div class="paragraph">
<p><em>Authors’ position: </em> WF</p>
</div>
<div class="paragraph">
<p><em>Outcome:</em> Weak consensus in favor</p>
</div>
<div class="paragraph">
<p>Forward P2546R3 to LWG for C++26 classified as B3 - addition to be confirmed to a library evolution electronic poll.</p>
</div>
<table class="tableblock frame-all grid-all fit-content">
<colgroup>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">SF</th>
<th class="tableblock halign-center valign-top">WF</th>
<th class="tableblock halign-center valign-top">N</th>
<th class="tableblock halign-center valign-top">WA</th>
<th class="tableblock halign-center valign-top">SA</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">8</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">13</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">1</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p><em>Attendance:</em> 22 (In-person) + 13 (Remote)</p>
</div>
<div class="paragraph">
<p><em># of Authors:</em> 1</p>
</div>
<div class="paragraph">
<p><em>Authors’ position: </em> SF</p>
</div>
<div class="paragraph">
<p><em>Outcome:</em> Strong Consensus in favor</p>
</div>
</div>
<div class="sect2">
<h3 id="_ewg_p2546r2_2022_11_08"><a class="anchor" href="#_ewg_p2546r2_2022_11_08"></a>6.4. EWG: P2546R2 (2022-11-08)</h3>
<div class="paragraph">
<p>Forward P2546R2 to LEWG, and suggest inclusion in C++26.</p>
</div>
<table class="tableblock frame-all grid-all fit-content">
<colgroup>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">SF</th>
<th class="tableblock halign-center valign-top">F</th>
<th class="tableblock halign-center valign-top">N</th>
<th class="tableblock halign-center valign-top">A</th>
<th class="tableblock halign-center valign-top">SA</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">4</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">13</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">1</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">1</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Result: Consensus</p>
</div>
</div>
<div class="sect2">
<h3 id="_sg15_p2546_2022_02_18"><a class="anchor" href="#_sg15_p2546_2022_02_18"></a>6.5. SG15: P2546 (2022-02-18)</h3>
<table class="tableblock frame-all grid-all fit-content">
<colgroup>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">SF</th>
<th class="tableblock halign-center valign-top">F</th>
<th class="tableblock halign-center valign-top">N</th>
<th class="tableblock halign-center valign-top">A</th>
<th class="tableblock halign-center valign-top">SA</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">3</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">4</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_sg15_p2514r0_and_p2515r0_2022_01_21"><a class="anchor" href="#_sg15_p2514r0_and_p2515r0_2022_01_21"></a>6.6. SG15: P2514R0 and P2515R0 (2022-01-21)</h3>
<div class="paragraph">
<p>SG15 approves of the design direction of P2514R0 and P2515R0 with the suggested
changes of merging the two papers and adding an unconditional breakpoint
interface.</p>
</div>
<table class="tableblock frame-all grid-all fit-content">
<colgroup>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">SF</th>
<th class="tableblock halign-center valign-top">F</th>
<th class="tableblock halign-center valign-top">N</th>
<th class="tableblock halign-center valign-top">A</th>
<th class="tableblock halign-center valign-top">SA</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">2</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">6</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Attendance: 8</p>
</div>
<div class="paragraph">
<p>Polls relating to the antecedent proposal P1279 are also of relevance. They can
found in the corresponding GitHub issue.
<sup class="footnote">[<a id="_footnoteref_25" class="footnote" href="#_footnotedef_25" title="View footnote.">25</a>]</sup></p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wording"><a class="anchor" href="#_wording"></a>7. Wording</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wording is relative to latest C&#43;&#43;26 draft.</p>
</div>
<div class="sect2">
<h3 id="_feature_test_macro"><a class="anchor" href="#_feature_test_macro"></a>7.1. Feature Test Macro</h3>
<div class="paragraph">
<p>In [version.syn] add:</p>
</div>
<div class="listingblock ins text-justify">
<div class="content">
<pre class="rouge highlight"><code data-lang="c++"><span class="cp">#define __cpp_lib_debugging YYYYMML // freestanding, also in &lt;debugging&gt;</span></code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_library"><a class="anchor" href="#_library"></a>7.2. Library</h3>
<div class="paragraph">
<p>Add a new entry to General utilities library summary [tab:utilities.summary] table.</p>
</div>
<div class="openblock ins text-justify">
<div class="content">
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">[debugging]</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Debugging</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;debugging&gt;</code></p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="paragraph">
<p>Add a new entry to the "C&#43;&#43; headers for freestanding implementations" table
[tab:headers.cpp.fs].</p>
</div>
<div class="openblock ins text-justify">
<div class="content">
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">[debugging]</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Debugging</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;debugging&gt;</code></p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="paragraph">
<p>Add section to General utilities library [utilities].</p>
</div>
<div class="sect3 ins text-justify">
<h4 id="dbg"><a class="anchor" href="#dbg"></a>7.2.1. Debugging <span class="right">[<a href="#dbg">debugging</a>]</span></h4>
<div class="sect4">
<h5 id="dbg-gen"><a class="anchor" href="#dbg-gen"></a>7.2.1.1. In general <span class="right">[<a href="#dbg-gen">debugging.general</a>]</span></h5>
<div class="paragraph">
<p>This subclause [debugging] describes functionality to introspect and interact
with the execution of the program.</p>
</div>
<div class="paragraph">
<p>[ <em>Note 1</em>:
The facilities provided by the debugging functionality interact with a program
that may be tracing the execution of a C&#43;&#43; program, such as a debugger.
&#8201;&#8212;&#8201;<em>end note</em> ]</p>
</div>
</div>
<div class="sect4">
<h5 id="dbg-syn"><a class="anchor" href="#dbg-syn"></a>7.2.1.2. Header <code>&lt;debugging&gt;</code> synopsis <span class="right">[<a href="#dbg-syn">debugging.syn</a>]</span></h5>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="c++"><span class="c1">// all freestanding</span>
<span class="k">namespace</span> <span class="n">std</span> <span class="p">{</span>
	<span class="c1">// [debugging.utility], utility</span>
	<span class="kt">void</span> <span class="n">breakpoint</span><span class="p">()</span> <span class="k">noexcept</span><span class="p">;</span>
	<span class="kt">void</span> <span class="n">breakpoint_if_debugging</span><span class="p">()</span> <span class="k">noexcept</span><span class="p">;</span>
	<span class="kt">bool</span> <span class="n">is_debugger_present</span><span class="p">()</span> <span class="k">noexcept</span><span class="p">;</span>
<span class="p">}</span></code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="dbg-util"><a class="anchor" href="#dbg-util"></a>7.2.1.3. Utility <span class="right">[<a href="#dbg-util">debugging.utility</a>]</span></h5>
<div class="openblock def">
<div class="content">
<div class="paragraph">
<p><code>void breakpoint() noexcept;</code></p>
</div>
<div class="paragraph">
<p>The semantics of this function are implementation-defined.</p>
</div>
<div class="paragraph">
<p>[ <em>Note 1</em>:
When invoked the execution of the program temporarily halts and execution is
handed to the debugger until such a time as: the program is terminated by the
debugger or, the debugger resumes execution of the program as if the function
was not invoked.
&#8201;&#8212;&#8201;<em>end note</em> ]</p>
</div>
</div>
</div>
<div class="openblock def">
<div class="content">
<div class="paragraph">
<p><code>void breakpoint_if_debugging() noexcept;</code></p>
</div>
<div class="paragraph">
<p><em>Effects</em>: Equivalent to:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="c++"><span class="k">if</span> <span class="p">(</span><span class="n">is_debugger_present</span><span class="p">())</span> <span class="n">breakpoint</span><span class="p">();</span></code></pre>
</div>
</div>
</div>
</div>
<div class="openblock def">
<div class="content">
<div class="paragraph">
<p><code>bool is_debugger_present() noexcept;</code></p>
</div>
<div class="paragraph">
<p>The semantics of this function are implementation-defined.</p>
</div>
<div class="paragraph">
<p>[ <em>Note 1</em>:
When tracing with a debugger the execution of a program an implementation
returns <code>true</code>. An implementation performs an immediate query, as needed, to
determine if the program is traced by a debugger.
On Windows, or equivalent, systems this can be achieved by calling the
<code>::IsDebuggerPresent()</code> Win32 function.
On POSIX this can be achieved by checking for a tracer parent process, with
best effort determination that such a tracer parent process is a debugger.
&#8201;&#8212;&#8201;<em>end note</em> ]</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_acknowledgements"><a class="anchor" href="#_acknowledgements"></a>8. Acknowledgements</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Thank you Isabella Muerte for the initial proposal from which this paper steals
a good amount of text.</p>
</div>
</div>
</div>
</div>
<div id="footnotes">
<hr>
<div class="footnote" id="_footnotedef_1">
<a href="#_footnoteref_1">1</a>. P2514R0 <code>std::breakpoint</code>, <em>René Ferdinand Rivera Morell</em> 2021-12-30 (<a href="https://wg21.link/P2514R0" class="bare">https://wg21.link/P2514R0</a>)
</div>
<div class="footnote" id="_footnotedef_2">
<a href="#_footnoteref_2">2</a>. P2515R0 <code>std::is_debugger_present</code>, <em>René Ferdinand Rivera Morell</em> 2021-12-29 (<a href="https://wg21.link/P2515R0" class="bare">https://wg21.link/P2515R0</a>)
</div>
<div class="footnote" id="_footnotedef_3">
<a href="#_footnoteref_3">3</a>. P1279 <code>std::breakpoint</code>, <em>Isabella Muerte</em> 2018-10-05 (<a href="https://wg21.link/P1279" class="bare">https://wg21.link/P1279</a>)
</div>
<div class="footnote" id="_footnotedef_4">
<a href="#_footnoteref_4">4</a>. Debugging prototype implementation (<a href="https://github.com/grafikrobot/debugging" class="bare">https://github.com/grafikrobot/debugging</a>)
</div>
<div class="footnote" id="_footnotedef_5">
<a href="#_footnoteref_5">5</a>. Microsoft compiler <code>__debugbreak</code> intrinsic (<a href="https://docs.microsoft.com/en-us/cpp/intrinsics/debugbreak" class="bare">https://docs.microsoft.com/en-us/cpp/intrinsics/debugbreak</a>)
</div>
<div class="footnote" id="_footnotedef_6">
<a href="#_footnoteref_6">6</a>. Win32 IsDebuggerPresent (<a href="https://docs.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent" class="bare">https://docs.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent</a>)
</div>
<div class="footnote" id="_footnotedef_7">
<a href="#_footnoteref_7">7</a>. LLVM Clang <code>__builtin_debugtrap</code> (<a href="https://clang.llvm.org/docs/LanguageExtensions.html#builtin-debugtrap" class="bare">https://clang.llvm.org/docs/LanguageExtensions.html#builtin-debugtrap</a>)
</div>
<div class="footnote" id="_footnotedef_8">
<a href="#_footnoteref_8">8</a>. armKEIL <code>__breakpoint</code> intrinsic (<a href="https://www.keil.com/support/man/docs/armcc/armcc_chr1359124993371.htm" class="bare">https://www.keil.com/support/man/docs/armcc/armcc_chr1359124993371.htm</a>)
</div>
<div class="footnote" id="_footnotedef_9">
<a href="#_footnoteref_9">9</a>. Portable Snippets (<a href="https://github.com/nemequ/portable-snippets" class="bare">https://github.com/nemequ/portable-snippets</a>)
</div>
<div class="footnote" id="_footnotedef_10">
<a href="#_footnoteref_10">10</a>. Portable Snippets Debug Trap (<a href="https://github.com/nemequ/portable-snippets/tree/master/debug-trap" class="bare">https://github.com/nemequ/portable-snippets/tree/master/debug-trap</a>)
</div>
<div class="footnote" id="_footnotedef_11">
<a href="#_footnoteref_11">11</a>. Debug Break Library (<a href="https://github.com/scottt/debugbreak" class="bare">https://github.com/scottt/debugbreak</a>)
</div>
<div class="footnote" id="_footnotedef_12">
<a href="#_footnoteref_12">12</a>. Boost.Test Library <code>debugger_break</code> (<a href="https://github.com/boostorg/test/blob/boost-1.78.0/include/boost/test/impl/debug.ipp#L708" class="bare">https://github.com/boostorg/test/blob/boost-1.78.0/include/boost/test/impl/debug.ipp#L708</a>)
</div>
<div class="footnote" id="_footnotedef_13">
<a href="#_footnoteref_13">13</a>. Boost.Test Library <code>under_debugger</code> (<a href="https://www.boost.org/doc/libs/1_78_0/libs/test/doc/html/boost/debug/under_debugger.html" class="bare">https://www.boost.org/doc/libs/1_78_0/libs/test/doc/html/boost/debug/under_debugger.html</a>)
</div>
<div class="footnote" id="_footnotedef_14">
<a href="#_footnoteref_14">14</a>. Boost.Test Library <code>attach_debugger(bool)</code> (<a href="https://www.boost.org/doc/libs/1_78_0/libs/test/doc/html/boost/debug/attach_debugger.html" class="bare">https://www.boost.org/doc/libs/1_78_0/libs/test/doc/html/boost/debug/attach_debugger.html</a>)
</div>
<div class="footnote" id="_footnotedef_15">
<a href="#_footnoteref_15">15</a>. EASTL <code>EASTL_DEBUG_BREAK</code> (<a href="https://github.com/electronicarts/EASTL/blob/3.18.00/include/EASTL/internal/config.h#L613" class="bare">https://github.com/electronicarts/EASTL/blob/3.18.00/include/EASTL/internal/config.h#L613</a>)
</div>
<div class="footnote" id="_footnotedef_16">
<a href="#_footnoteref_16">16</a>. Catch2 <code>isDebuggerActive</code> (<a href="https://github.com/catchorg/Catch2/blob/devel/src/catch2/internal/catch_debugger.cpp" class="bare">https://github.com/catchorg/Catch2/blob/devel/src/catch2/internal/catch_debugger.cpp</a>)
</div>
<div class="footnote" id="_footnotedef_17">
<a href="#_footnoteref_17">17</a>. Catch2 <code>CATCH_TRAP</code> and <code>CATCH_BREAK_INTO_DEBUGGER</code> (<a href="https://github.com/catchorg/Catch2/blob/v3.0.0-preview4/src/catch2/internal/catch_debugger.hpp" class="bare">https://github.com/catchorg/Catch2/blob/v3.0.0-preview4/src/catch2/internal/catch_debugger.hpp</a>)
</div>
<div class="footnote" id="_footnotedef_18">
<a href="#_footnoteref_18">18</a>. JUCE juce_isRunningUnderDebugger (<a href="https://github.com/juce-framework/JUCE/blob/6.1.5/modules/juce_core/juce_core.h#L218" class="bare">https://github.com/juce-framework/JUCE/blob/6.1.5/modules/juce_core/juce_core.h#L218</a>)
</div>
<div class="footnote" id="_footnotedef_19">
<a href="#_footnoteref_19">19</a>. JUCE JUCE_BREAK_IN_DEBUGGER (<a href="https://github.com/juce-framework/JUCE/blob/6.1.5/modules/juce_core/system/juce_PlatformDefs.h#L63" class="bare">https://github.com/juce-framework/JUCE/blob/6.1.5/modules/juce_core/system/juce_PlatformDefs.h#L63</a>)
</div>
<div class="footnote" id="_footnotedef_20">
<a href="#_footnoteref_20">20</a>. Dear ImGui IM_DEBUG_BREAK (<a href="https://github.com/ocornut/imgui/blob/v1.86/imgui_internal.h#L257" class="bare">https://github.com/ocornut/imgui/blob/v1.86/imgui_internal.h#L257</a>)
</div>
<div class="footnote" id="_footnotedef_21">
<a href="#_footnoteref_21">21</a>. AWS C Common aws_is_debugger_present (<a href="https://github.com/awslabs/aws-c-common/blob/v0.6.19/include/aws/common/system_info.h#L51" class="bare">https://github.com/awslabs/aws-c-common/blob/v0.6.19/include/aws/common/system_info.h#L51</a>)
</div>
<div class="footnote" id="_footnotedef_22">
<a href="#_footnoteref_22">22</a>. AWS C Common aws_debug_break (<a href="https://github.com/awslabs/aws-c-common/blob/v0.6.19/include/aws/common/system_info.h#L55" class="bare">https://github.com/awslabs/aws-c-common/blob/v0.6.19/include/aws/common/system_info.h#L55</a>)
</div>
<div class="footnote" id="_footnotedef_23">
<a href="#_footnoteref_23">23</a>. Unreal&#174; Engine (<a href="https://www.unrealengine.com" class="bare">https://www.unrealengine.com</a>)
</div>
<div class="footnote" id="_footnotedef_24">
<a href="#_footnoteref_24">24</a>. P2776R0 2023-05 Library Evolution Poll Outcomes (<a href="https://wg21.link/P2776R0" class="bare">https://wg21.link/P2776R0</a>)
</div>
<div class="footnote" id="_footnotedef_25">
<a href="#_footnoteref_25">25</a>. P1279 GitHub Issue (<a href="https://github.com/cplusplus/papers/issues/307" class="bare">https://github.com/cplusplus/papers/issues/307</a>)
</div>
</div>
</body>
</html>