Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Vladimir Prus <ghost@cs.msu.su>
To: Nick Roberts <nickrob@snap.net.nz>
Cc: gdb-patches@sources.redhat.com
Subject: Re: RFC: MI - Detecting change of string contents with variable objects
Date: Mon, 18 Dec 2006 08:36:00 -0000	[thread overview]
Message-ID: <200612181136.02429.ghost@cs.msu.su> (raw)
In-Reply-To: <17798.19683.251190.740216@kahikatea.snap.net.nz>

On Monday 18 December 2006 11:10, Nick Roberts wrote:

>  > > Currently variable objects treat strings as pointers so -var-update only
>  > > detects a change of address or, if the child is created, when the first
>  > > character changes.  The patch below detects when the contents change which
>  > > is
>  > > more useful.  I've only tested it for C, but I guess it could work for
>  > > other
>  > > languages that variable objects handle (C++, Java).  The function
>  > > value_get_value gets both the address and string value but it's probably
>  > > better to just get the string value directly.
>  > 
>  > I think this is probably a wrong thing to do in MI. Yes, this helps with
>  > char*, but char* happens to be not so important in C++ -- modern code
>  > mostly uses std::string (or QString, or gtkmm::ustring, or whatever). This
>  > patch does not help with those, for the frontend is required to contain
>  > special code to handle string classes. As as soon as it has such special
>  > code, handling char* can be done in frontend as well. 
> 
> You seem to be saying that because it won't work generally for C++ it should
> not be made to work for C.

Right, because it would be bad to have, in any given frontend, two different solutions
for C and C++. 

>  > but I think we need to avoid special-casing C while not solving any problems
>  > with C++. 
> 
> I think it's better than nothing.  If you can think of a more general approach
> that would be even better.

First of all, what's the problem? The problem as I see is that for some types,
default comparison rules used by MI is not appropriate. This problem
can be solved either by:

	1. Having frontend grab the value on each step and do the comparison itself.
	2. Adding some 'comparison customization' to MI.

(2) might work like this:

	-var-set-comparator V "strcmp($a, $b) == 0"

then MI can set "$a" and "$b" to old and new value, and evaluate this
expression.

I'm not sure if (1) or (2) is better. (2) is slightly easier for frontend and it *might* reduce
the traffic between gdb and frontend.

But (2) has a serious problem -- for std::wstring and QString, frontend has to read
the data itself to present it to the user, since 

	-var-evaluate-expression 

returns nothing interesting for std::wstring and QString. This suggests that we need:

	-var-set-format-expression "................."

and the ellipsis part is a big problem. For QString, KDevelop does the following:

	$kdev_d=%1.d
	$kdev_s=$kdev_d.size
	$kdev_s= ($kdev_s > 0)? ($kdev_s > 100 ? 200 : 2*$kdev_s) : 0
        ($kdev_s>0) ? (*((char*)&$kdev_d.unicode[0])@$kdev_s) : \"\""

and for complex data structures things can get out of control -- I don't fancy writing
programs in gdb script language.

Imagine the most complex case: std::map. Should variable object detect changes
in objects of that kind by looking at all contained elements and comparing them?
Should formatting of std::map be done in gdb, or in frontend? 

If it's better be done in gdb, then I think we'd need Python binding, so that you can do:

	define_python_function kdevelop_format_std_map ...........

	-var-set-format-expression V "kdevelop_format_std_map($a)"

or something like that. But as I say, I don't yet sure such formatting should happen in gdb.
 
>  >            You mentioned that Insight handles char* just fine -- using
>  > current MI code. What approach is take there?
> 
> GDB is built into Insight as a single executable, it doesn't rely on
> interprocess communication with the frontend.  It compares the displayed string
> in the watch expression window with the current value.

Ah, ok.

- Volodya


  reply	other threads:[~2006-12-18  8:36 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-18  2:42 Nick Roberts
2006-12-18  7:01 ` Vladimir Prus
2006-12-18  8:15   ` Nick Roberts
2006-12-18  8:36     ` Vladimir Prus [this message]
2006-12-18 13:38       ` Daniel Jacobowitz
2006-12-18 21:57         ` Nick Roberts
2006-12-21 15:25           ` Vladimir Prus
2006-12-21 22:28             ` Nick Roberts
2006-12-22  6:16               ` Vladimir Prus
2006-12-22  7:16                 ` Nick Roberts
2006-12-22  7:23                   ` Vladimir Prus
2007-01-03 22:46           ` Daniel Jacobowitz
2007-01-04  4:13             ` Nick Roberts
2007-01-04  4:20               ` Daniel Jacobowitz
2007-01-04  6:10                 ` Nick Roberts
2007-01-04 19:40                   ` Daniel Jacobowitz
2007-01-04 20:35                     ` Nick Roberts
2007-01-04 20:50                       ` Daniel Jacobowitz
2007-01-04 21:00                         ` Vladimir Prus
2007-01-05  4:46                           ` Nick Roberts
2007-01-05 14:49                             ` Daniel Jacobowitz
2007-01-05 21:54                               ` Nick Roberts
2007-01-06  7:07                                 ` Vladimir Prus
2007-01-08 15:51                                 ` Daniel Jacobowitz
2007-01-08 21:30                                   ` Nick Roberts
2007-01-08 21:41                                     ` Daniel Jacobowitz
2007-01-04 20:57                       ` Vladimir Prus
2007-01-05  2:26                         ` Nick Roberts
2007-01-04 21:05                   ` Vladimir Prus
2007-01-05  1:09                     ` Nick Roberts
2007-01-05 14:44                       ` Daniel Jacobowitz
2007-01-05 14:49                         ` Vladimir Prus
2007-01-05 16:04                       ` Jim Blandy

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=200612181136.02429.ghost@cs.msu.su \
    --to=ghost@cs.msu.su \
    --cc=gdb-patches@sources.redhat.com \
    --cc=nickrob@snap.net.nz \
    /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