Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Simon Marchi <simark@simark.ca>
To: George Barrett <bob@bob131.so>, gdb-patches@sourceware.org
Subject: Re: [PATCH] Fix Python probe breakpoints
Date: Sun, 08 Dec 2019 02:35:00 -0000	[thread overview]
Message-ID: <6368e25a-ee80-6b07-e42a-363ab2dcbd7c@simark.ca> (raw)
In-Reply-To: <hy4twfjtf2_d77s.fqzjeskq9ahknu9c8nzpjrhd46pkcr32ys11@mail.bob131.so>

On 2019-12-07 11:46 a.m., George Barrett wrote:
> The documentation for the `spec' variant of the gdb.Breakpoint
> constructor states that the accepted format is the same as the break
> command. However, using the -probe qualifier at the beginning of the
> breakpoint specifier causes a GDB internal error as it attempts to
> decode a probe location in the wrong code path. Without this
> functionality, there doesn't appear to be another way to set breakpoints
> on probe points from Python scripts.
> 
> This patch changes the constructor to test whether the parsed breakpoint
> location is a probe, and if so it uses the probe-specific breakpoint ops
> instead.

Hi George,

Thanks for the patch, especially for providing a test case along with it.

> 
> gdb/ChangeLog:
> 2019-12-08  George Barrett  <bob@bob131.so>
> 
> 	Fix Python probe breakpoints.
> 	* breakpoint.c: Make bkpt_probe_breakpoint_ops non-static.
> 	* breakpoint.h: Add declaration for bkpt_probe_breakpoint_ops.
> 	* python/py-breakpoint.c: Use probe ops if the specifier is a
> 	probe specifier.

Put the name of the modified variable or function in parenthesis after the file
name, like:

	* breakpoint.c (bkpt_probe_breakpoint_ops): Make non-static.

> 
> gdb/testsuite/ChangeLog:
> 2019-12-08  George Barrett  <bob@bob131.so>
> 
> 	Test Python probe breakpoints.
> 	* gdb.python/py-breakpoint.c: Add probe point.
> 	* gdb.python/py-breakpoint.exp: Add probe specifier test.
> ---
>  gdb/breakpoint.c                           |  2 +-
>  gdb/breakpoint.h                           |  1 +
>  gdb/python/py-breakpoint.c                 |  5 ++++-
>  gdb/testsuite/gdb.python/py-breakpoint.c   |  7 +++++++
>  gdb/testsuite/gdb.python/py-breakpoint.exp | 22 ++++++++++++++++++++++
>  5 files changed, 35 insertions(+), 2 deletions(-)
> 
> diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
> index 583f46d852..0e3f6d954a 100644
> --- a/gdb/breakpoint.c
> +++ b/gdb/breakpoint.c
> @@ -244,7 +244,7 @@ static struct breakpoint_ops momentary_breakpoint_ops;
>  struct breakpoint_ops bkpt_breakpoint_ops;
>  
>  /* Breakpoints set on probes.  */
> -static struct breakpoint_ops bkpt_probe_breakpoint_ops;
> +struct breakpoint_ops bkpt_probe_breakpoint_ops;
>  
>  /* Dynamic printf class type.  */
>  struct breakpoint_ops dprintf_breakpoint_ops;
> diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
> index a9d689d02a..47ca1174ab 100644
> --- a/gdb/breakpoint.h
> +++ b/gdb/breakpoint.h
> @@ -1307,6 +1307,7 @@ extern void tbreak_command (const char *, int);
>  extern struct breakpoint_ops base_breakpoint_ops;
>  extern struct breakpoint_ops bkpt_breakpoint_ops;
>  extern struct breakpoint_ops tracepoint_breakpoint_ops;
> +extern struct breakpoint_ops bkpt_probe_breakpoint_ops;
>  extern struct breakpoint_ops dprintf_breakpoint_ops;
>  
>  extern void initialize_breakpoint_ops (void);
> diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c
> index 4170737416..ddd8eeecae 100644
> --- a/gdb/python/py-breakpoint.c
> +++ b/gdb/python/py-breakpoint.c
> @@ -834,7 +834,10 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
>  			       temporary_bp, bp_breakpoint,
>  			       0,
>  			       AUTO_BOOLEAN_TRUE,
> -			       &bkpt_breakpoint_ops,
> +			       (event_location_type (location.get ())
> +				 == PROBE_LOCATION
> +				    ? &bkpt_probe_breakpoint_ops
> +				    : &bkpt_breakpoint_ops),
>  			       0, 1, internal_bp, 0);
>  	    break;
>  	  }

A suggestion to improve maintainability.  To avoid duplicating the logic, define a function
"breakpoint_ops_for_event_location_type" that does this conversion, and use it in the
break_command_1 function too.  Can you check if Guile exhibits the same problem?  I'm guessing
that the gdbscm_register_breakpoint_x should receive the same treatment.

> diff --git a/gdb/testsuite/gdb.python/py-breakpoint.c b/gdb/testsuite/gdb.python/py-breakpoint.c
> index d102a5f306..bf5bec1200 100644
> --- a/gdb/testsuite/gdb.python/py-breakpoint.c
> +++ b/gdb/testsuite/gdb.python/py-breakpoint.c
> @@ -15,6 +15,10 @@
>     You should have received a copy of the GNU General Public License
>     along with this program.  If not, see  <http://www.gnu.org/licenses/>.  */
>  
> +#ifdef USE_PROBES
> +#include <sys/sdt.h>
> +#endif
> +
>  int result = 0;
>  
>  namespace foo_ns
> @@ -46,6 +50,9 @@ int main (int argc, char *argv[])
>      {
>        result += multiply (foo);  /* Break at multiply. */
>        result += add (bar); /* Break at add. */
> +#ifdef USE_PROBES
> +      STAP_PROBE1 (test, result_updated, result);
> +#endif
>      }
>  
>    return 0; /* Break at end. */
> diff --git a/gdb/testsuite/gdb.python/py-breakpoint.exp b/gdb/testsuite/gdb.python/py-breakpoint.exp
> index 625977c0ad..9e3cb475af 100644
> --- a/gdb/testsuite/gdb.python/py-breakpoint.exp
> +++ b/gdb/testsuite/gdb.python/py-breakpoint.exp
> @@ -695,6 +695,27 @@ proc_with_prefix test_bkpt_qualified {} {
>  	"-q in spec string and qualified false"
>  }
>  
> +proc_with_prefix test_bkpt_probe {} {
> +    global decimal hex testfile srcfile
> +
> +    if { [prepare_for_testing "failed to prepare" ${testfile}-probes \
> +	    ${srcfile} {debug c++ additional_flags=-DUSE_PROBES}] } {
> +	untested "breakpoint probe test failed"

Hmm, this should say that the compilation failed (not the test), like
"breakpoint probe test compilation failed". But anyway, prepare_for_testing
already prints an "untested":

  UNTESTED: gdb.python/py-breakpoint.exp: test_bkpt_probe: failed to prepare

so I think you could just remove it.

> +	return -1
> +    }
> +
> +    if ![runto_main] then {
> +	fail "cannot run to main."
> +	return 0
> +    }
> +
> +    delete_breakpoints

If this delete_breakpoints isn't necessary, let's remove it.

Thanks,

Simon


  reply	other threads:[~2019-12-08  2:35 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-07 16:46 George Barrett
2019-12-08  2:35 ` Simon Marchi [this message]
2019-12-08  3:11   ` George Barrett
2019-12-08 15:44     ` Simon Marchi
2020-01-21 20:23 ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6368e25a-ee80-6b07-e42a-363ab2dcbd7c@simark.ca \
    --to=simark@simark.ca \
    --cc=bob@bob131.so \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox