Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Michael Veksler <mveksler@tx.technion.ac.il>
To: "Ed S. Peschko" <esp5@pge.com>
Cc: Eli Zaretskii <eliz@gnu.org>, gdb@sourceware.org
Subject: Re: dynamic breakpoints/watchpoints
Date: Wed, 14 Mar 2007 09:20:00 -0000	[thread overview]
Message-ID: <45F7BE52.8020409@tx.technion.ac.il> (raw)
In-Reply-To: <20070314083409.GA21561@venus>

Ed S. Peschko wrote:
> For example, 
>
> int main()
> {
> 	==>	int stuff;
> 	aha();
> 	aha2();
> }
>
>
> int aha()
> {
> 	fprintf(stderr, "HERE1");
> }
>
> int aha2()
> {
> 	fprintf(stderr, "HERE");
> }
> 	
> Suppose that I'm at the '==>'. if I say bc /HERE/", I would break in the 
> function 'aha', at the fprintf statement HERE1'. If I said bc /HERE/ at THAT
> point, then I'd break at 'HERE2'. The breakpoint changes as you go along.
>   
What I usually do is use emacs' tags system to search for the string, 
and then manually put breakpoints at the relevant locations. This works 
well when there is only couple of matching lines.
My normal use case is:

   1. An error text is printed, or some activity is logged into a file.
   2. I want to stop right at the place that caused that behavior. So I
      perform the following:
         1. Try to guess how the relevant code looks like
         2. Look for all occurrences of such code using grep/tags
         3. If search result is too wide or too narrow go to step i.
         4. Break at all relevant locations

This process is quite long and prone to errors. It would be much better 
if it were integrated into gdb+libc+libstdc++ in the following way:

   1. libc+libstdc++ will have hooks that gdb will be able to use to
      intercept FILE/stream writes.
   2. A slower alternative to 1 is for for GDB to intercept write system
      calls, and check their contents. To improve granularity in C,
      buffering should be set to line granularity. In C++, buffering
      should be eliminated (unless people use std::endl instead of the
      much better "\n").
   3. GDB will stop at each write, and look for the requested text. If
      the text is encountered - break.

This technique can be implemented to a limited extend by a conditional 
breakpoint on write() which will wait for memmem(name_of_buffer_arg, 
size_of_buffer, your_text, strlen(your_text) ). But that is ugly, 
imperfect and is not something you want to require from average users to 
implement. I was never desperate enough to implement this in my code. 
This should be implemented in gdb+glibc+libstdc++.

My proposed feature seems easier to implement and more powerful in the 
cases that interest me (and you?).

Even the watchpoints of std::string can be implemented by some hooks 
provided by the libstdc++ team. They could add an strcmp looking for the 
requested string, every time the string is mutated, and then GDB will be 
able to break on a match. Other data-types are more complicated, and 
most of them are impractical candidates for dynamic watchpoints (unless 
GCC is heavily modified to insert hooks for all updates to, for example, 
int variables - this will be slow as hell).

---
Michael


  reply	other threads:[~2007-03-14  9:20 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-14  0:22 Ed S. Peschko
2007-03-14  4:20 ` Eli Zaretskii
2007-03-14  8:34   ` Ed S. Peschko
2007-03-14  9:20     ` Michael Veksler [this message]
2007-03-14 18:03       ` Ed S. Peschko
2007-03-14 18:49         ` Eli Zaretskii
     [not found]         ` <45F87DAC.8030404@tx.technion.ac.il>
2007-03-15 21:36           ` Ed S. Peschko

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=45F7BE52.8020409@tx.technion.ac.il \
    --to=mveksler@tx.technion.ac.il \
    --cc=eliz@gnu.org \
    --cc=esp5@pge.com \
    --cc=gdb@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