On Mon, 5 May 2025 at 10:16, Uros Bizjak <ubiz...@gmail.com> wrote:
>
> On Thu, May 1, 2025 at 12:59 PM Jonathan Wakely <jwak...@redhat.com> wrote:
> >
> > This includes the P2810R4 (is_debugger_present is_replaceable) changes,
> > allowing std::is_debugger_present to be replaced by the program.
> >
> > It would be good to provide a macOS definition of is_debugger_present as
> > per https://developer.apple.com/library/archive/qa/qa1361/_index.html
> > but that isn't included in this change.
> >
> > The src/c++26/debugging.cc file defines a global volatile int which can
> > be set by debuggers to indicate when they are attached and detached from
> > a running process. This allows std::is_debugger_present() to give a
> > reliable answer, and additionally allows a debugger to choose how
> > std::breakpoint() should behave. Setting the global to a positive value
> > will cause std::breakpoint() to use that value as an argument to
> > std::raise, so debuggers that prefer SIGABRT for breakpoints can select
> > that. By default std::breakpoint() will use a platform-specific action
> > such as the INT3 instruction on x86, or GCC's __builtin_trap().
> >
> > On Linux the std::is_debugger_present() function checks whether the
> > process is being traced by a process named "gdb", "gdbserver" or
> > "lldb-server", to try to avoid interpreting other tracing processes
> > (such as strace) as a debugger. There have been comments suggesting this
> > isn't desirable and that std::is_debugger_present() should just return
> > true for any tracing process (which is the case for non-Linux targets
> > that support the ptrace system call).
> >
> > libstdc++-v3/ChangeLog:
> >
> >         * config.h.in: Regenerate.
> >         * configure: Regenerate.
> >         * configure.ac: Check for facilities needed by <debugging>.
> >         * include/Makefile.am: Add new header.
> >         * include/Makefile.in: Regenerate.
> >         * include/bits/version.def (debugging): Add.
> >         * include/bits/version.h: Regenerate.
> >         * include/precompiled/stdc++.h: Add new header.
> >         * src/c++26/Makefile.am: Add new file.
> >         * src/c++26/Makefile.in: Regenerate.
> >         * include/std/debugging: New file.
> >         * src/c++26/debugging.cc: New file.
> >         * testsuite/19_diagnostics/debugging/breakpoint.cc: New test.
> >         * testsuite/19_diagnostics/debugging/breakpoint_if_debugging.cc:
> >         New test.
> >         * testsuite/19_diagnostics/debugging/is_debugger_present.cc: New
> >         test.
> >         * testsuite/19_diagnostics/debugging/is_debugger_present-2.cc:
> >         New test.
> > ---
>
> > +#elif defined(__i386__) || defined(__x86_64__)
> > +  __asm__ volatile ("int3; nop");
>
> Just a small nit - can this be written as:
>
> "int3\n\tnop"
>
> And perhaps add a small comment about "nop", that is added due to gdb issues.

Thanks, I made that change locally.

I haven't pushed this patch yet because it breaks bootstrap on AIX.
The ptrace syscall has a different signature, so I needed to add a
proper configure test for it. With that fixed, it compiles
debugging.cc but can't assemble it:

Assembler:
/tmp//ccvib7J4.s: line 64: 1252-016 The specified opcode or pseudo-op
is not valid.
       Use supported instructions or pseudo-ops only.
/tmp//ccvib7J4.s: line 84: 1252-016 The specified opcode or pseudo-op
is not valid.
       Use supported instructions or pseudo-ops only.
gmake[3]: *** [Makefile:565: debugging.lo] Error 1

Reply via email to