Mirror of the gdb mailing list
 help / color / mirror / Atom feed
* gdb printing of dynamically allocated matrix
@ 2007-07-18 17:59 Peter Toft
  2007-07-18 19:32 ` Daniel Jacobowitz
  0 siblings, 1 reply; 10+ messages in thread
From: Peter Toft @ 2007-07-18 17:59 UTC (permalink / raw)
  To: gdb

Focus of this mail is GDB on 1D and 2D arrays.

I have pasted a small C-code program at
http://pastebin.com/f63009dd8
(download from http://pastebin.com/pastebin.php?dl=f63009dd8)
which I like your opinion on.

I compile it with "gcc -g"
Throw a breakpoint on line 59 and run under gdb.

* I can see the contents of the "a"-vector in by
  (gdb) print *a @ 3
  Very cool!

* I can see the matrix (2D array) contents of the "c"
  matrix by
  (gdb) print c
  Elegant - very cool!

* However how can I use GDB to see the contents of "b"
  similar to the contents of "c" and "a"?
  The best I can do is
  (gdb) print *b[0] @3
  (gdb) print *b[1] @3
  Obviously I would like to do the display in one command rather
  than several, especially if I changed the b-matrix to be b[7][8]
  I think I will manually have to supply the length of the vectors,
  but it seems that I cannot do a compound GDB-operation like
  (gdb) print **b @3 @2
  and get
  {{2, -2, 22},{12 -12 -12}}
  instead I get
  {{2, -2, 22},{17# 12# -12}}
  where I have inserted #-marks where I find wrong values.
  How come that the next vector contains wrong values?
  Or rather - how can I see the b content in one command?

Best


-- 
Peter Toft <pto@linuxbog.dk>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: gdb printing of dynamically allocated matrix
  2007-07-18 17:59 gdb printing of dynamically allocated matrix Peter Toft
@ 2007-07-18 19:32 ` Daniel Jacobowitz
  2007-07-18 20:32   ` Peter Toft
  0 siblings, 1 reply; 10+ messages in thread
From: Daniel Jacobowitz @ 2007-07-18 19:32 UTC (permalink / raw)
  To: Peter Toft; +Cc: gdb

On Wed, Jul 18, 2007 at 01:22:33PM +0200, Peter Toft wrote:
> * However how can I use GDB to see the contents of "b"
>  similar to the contents of "c" and "a"?
>  The best I can do is
>  (gdb) print *b[0] @3
>  (gdb) print *b[1] @3
>  Obviously I would like to do the display in one command rather
>  than several, especially if I changed the b-matrix to be b[7][8]

I don't believe this is possible without writing a user-defined
command for it - see the manual.

>  How come that the next vector contains wrong values?

It's printing six consecutive elements from memory.

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: gdb printing of dynamically allocated matrix
  2007-07-18 19:32 ` Daniel Jacobowitz
@ 2007-07-18 20:32   ` Peter Toft
  2007-07-18 21:56     ` Peter Toft
  0 siblings, 1 reply; 10+ messages in thread
From: Peter Toft @ 2007-07-18 20:32 UTC (permalink / raw)
  To: gdb

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1077 bytes --]

On Wed, 18 Jul 2007, Daniel Jacobowitz wrote:

> On Wed, Jul 18, 2007 at 01:22:33PM +0200, Peter Toft wrote:
> > * However how can I use GDB to see the contents of "b"
> >  similar to the contents of "c" and "a"?
> >  The best I can do is
> >  (gdb) print *b[0] @3
> >  (gdb) print *b[1] @3
> >  Obviously I would like to do the display in one command rather
> >  than several, especially if I changed the b-matrix to be b[7][8]
> 
> I don't believe this is possible without writing a user-defined
> command for it - see the manual.

Something like

define matprint 
  set $i = 0
  while $i< $arg1
    echo $arg0[$i++][0] @ $arg2
  end
end

so I then can do 
(gdb) matprint c 2 3

close but I quess it can be made better[1] 


> 
> >  How come that the next vector contains wrong values?
> 
> It's printing six consecutive elements from memory.

Yeah - seems to be the case

Thanx Daniel

Best regards

Peter

[1] after GDB-101 manual crash reading :)

-- 
Peter Toft, Ph.D. [pto@linuxbog.dk] http://petertoft.dk
Følg min Linux-blog på http://www.version2.dk/blogs/petertoft

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: gdb printing of dynamically allocated matrix
  2007-07-18 20:32   ` Peter Toft
@ 2007-07-18 21:56     ` Peter Toft
  2007-07-19  3:10       ` Daniel Jacobowitz
  2007-07-20 19:08       ` Jim Blandy
  0 siblings, 2 replies; 10+ messages in thread
From: Peter Toft @ 2007-07-18 21:56 UTC (permalink / raw)
  To: gdb

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1954 bytes --]

On Wed, 18 Jul 2007, Peter Toft wrote:

> On Wed, 18 Jul 2007, Daniel Jacobowitz wrote:
> 
> > On Wed, Jul 18, 2007 at 01:22:33PM +0200, Peter Toft wrote:
> > > * However how can I use GDB to see the contents of "b"
> > >  similar to the contents of "c" and "a"?
> > >  The best I can do is
> > >  (gdb) print *b[0] @3
> > >  (gdb) print *b[1] @3
> > >  Obviously I would like to do the display in one command rather
> > >  than several, especially if I changed the b-matrix to be b[7][8]
> > 
> > I don't believe this is possible without writing a user-defined
> > command for it - see the manual.
> 
> Something like
> 
> define matprint 
>   set $i = 0
>   while $i< $arg1
>     echo $arg0[$i++][0] @ $arg2
>   end
> end
> 
> so I then can do 
> (gdb) matprint c 2 3
> 
> close but I quess it can be made better[1] 

or ...
define matprint2
  set $i = 0 
  print  
  printf "{{"
  while $i< $arg1 
    set $j = 0  
    printf "%d",$arg0[$i][$j++]
    while $j< $arg2
      printf ", %d",$arg0[$i][$j++]
    end
    printf "}"
    set $i = 1+$i
    if $i < $arg1
      printf ", {"
    end
  end
  printf "}\n"
end


(gdb) matprint c 2 3
{{2, -2, 22}, {12, -12, 212}}

From the manual I don't understand how the macro is further hacked to also 
give the exact output format as 
(gdb) print c
$1 = {{2, -2, 22}, {12, -12, -12}}

so my matprint does not insert into a dollar variable - can someone help 
with this last part?

/peter

> 
> 
> > 
> > >  How come that the next vector contains wrong values?
> > 
> > It's printing six consecutive elements from memory.
> 
> Yeah - seems to be the case
> 
> Thanx Daniel
> 
> Best regards
> 
> Peter
> 
> [1] after GDB-101 manual crash reading :)
> 
> -- 
> Peter Toft, Ph.D. [pto@linuxbog.dk] http://petertoft.dk
> Følg min Linux-blog på http://www.version2.dk/blogs/petertoft
> 

-- 
Peter Toft, Ph.D. [pto@linuxbog.dk] http://petertoft.dk
Følg min Linux-blog på http://www.version2.dk/blogs/petertoft

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: gdb printing of dynamically allocated matrix
  2007-07-18 21:56     ` Peter Toft
@ 2007-07-19  3:10       ` Daniel Jacobowitz
  2007-07-20 18:48         ` Peter Toft
  2007-07-20 19:08       ` Jim Blandy
  1 sibling, 1 reply; 10+ messages in thread
From: Daniel Jacobowitz @ 2007-07-19  3:10 UTC (permalink / raw)
  To: Peter Toft; +Cc: gdb

On Wed, Jul 18, 2007 at 10:32:19PM +0200, Peter Toft wrote:
> From the manual I don't understand how the macro is further hacked to also 
> give the exact output format as 
> (gdb) print c
> $1 = {{2, -2, 22}, {12, -12, -12}}
> 
> so my matprint does not insert into a dollar variable - can someone help 
> with this last part?

I don't think you're going to be able to do that - our type system
does not deal well with structures that don't live exactly in target
memory.  Yet.

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: gdb printing of dynamically allocated matrix
  2007-07-19  3:10       ` Daniel Jacobowitz
@ 2007-07-20 18:48         ` Peter Toft
  0 siblings, 0 replies; 10+ messages in thread
From: Peter Toft @ 2007-07-20 18:48 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb

[-- Attachment #1: Type: TEXT/PLAIN, Size: 885 bytes --]

On Wed, 18 Jul 2007, Daniel Jacobowitz wrote:

> On Wed, Jul 18, 2007 at 10:32:19PM +0200, Peter Toft wrote:
> > From the manual I don't understand how the macro is further hacked to also 
> > give the exact output format as 
> > (gdb) print c
> > $1 = {{2, -2, 22}, {12, -12, -12}}
> > 
> > so my matprint does not insert into a dollar variable - can someone help 
> > with this last part?
> 
> I don't think you're going to be able to do that - our type system
> does not deal well with structures that don't live exactly in target
> memory.  Yet.

ok - on your "Yet" statement -> such an improvement would be very 
interesting for most designers working with numerical analysis, 
signal&image processing, and similar fields of work.

Thank you again

Peter

-- 
Peter Toft, Ph.D. [pto@linuxbog.dk] http://petertoft.dk
Følg min Linux-blog på http://www.version2.dk/blogs/petertoft

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: gdb printing of dynamically allocated matrix
  2007-07-18 21:56     ` Peter Toft
  2007-07-19  3:10       ` Daniel Jacobowitz
@ 2007-07-20 19:08       ` Jim Blandy
  2007-07-21 14:16         ` Peter Toft
  1 sibling, 1 reply; 10+ messages in thread
From: Jim Blandy @ 2007-07-20 19:08 UTC (permalink / raw)
  To: Peter Toft; +Cc: gdb


Peter Toft <pto@linuxbog.dk> writes:
>> (gdb) matprint c 2 3

Could you use sizeof to compute the dimensions automatically?  Or at
least one of them?


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: gdb printing of dynamically allocated matrix
  2007-07-20 19:08       ` Jim Blandy
@ 2007-07-21 14:16         ` Peter Toft
  2007-07-23 17:05           ` Jim Blandy
  0 siblings, 1 reply; 10+ messages in thread
From: Peter Toft @ 2007-07-21 14:16 UTC (permalink / raw)
  To: Jim Blandy; +Cc: gdb

[-- Attachment #1: Type: TEXT/PLAIN, Size: 672 bytes --]

On Fri, 20 Jul 2007, Jim Blandy wrote:

> 
> Peter Toft <pto@linuxbog.dk> writes:
> >> (gdb) matprint c 2 3
> 
> Could you use sizeof to compute the dimensions automatically?  Or at
> least one of them?

Dear Jim

I think I understand which direction you are point me to, but
"sizeof" in GDB does not ring a bell here. In C yes, but in GDB no.

Can you give me an example e.g. for 1D arrays? We might target this 
snippet befor we move to 2D matrices;

  int *a;
  a=(int *)malloc(3*sizeof(int));
  a[0] = 1;
  a[1] = 6;
  a[2] = 8;

Best

Peter


-- 
Peter Toft, Ph.D. [pto@linuxbog.dk] http://petertoft.dk
Følg min Linux-blog på http://www.version2.dk/blogs/petertoft

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: gdb printing of dynamically allocated matrix
  2007-07-21 14:16         ` Peter Toft
@ 2007-07-23 17:05           ` Jim Blandy
  2007-07-23 21:38             ` Peter Toft
  0 siblings, 1 reply; 10+ messages in thread
From: Jim Blandy @ 2007-07-23 17:05 UTC (permalink / raw)
  To: Peter Toft; +Cc: gdb


Peter Toft <pto@linuxbog.dk> writes:
> On Fri, 20 Jul 2007, Jim Blandy wrote:
>
>> 
>> Peter Toft <pto@linuxbog.dk> writes:
>> >> (gdb) matprint c 2 3
>> 
>> Could you use sizeof to compute the dimensions automatically?  Or at
>> least one of them?
>
> Dear Jim
>
> I think I understand which direction you are point me to, but
> "sizeof" in GDB does not ring a bell here. In C yes, but in GDB no.
>
> Can you give me an example e.g. for 1D arrays? We might target this 
> snippet befor we move to 2D matrices;
>
>   int *a;
>   a=(int *)malloc(3*sizeof(int));
>   a[0] = 1;
>   a[1] = 6;
>   a[2] = 8;

Ah, if you're allocating dynamically, then there's no way to do it
using sizeof.

GDB supports the C 'sizeof' operator; in your example above, 'print
sizeof (a)' will give you '4' or '8' or whatever is appropriate for a
pointer on the program being debugged.  There are no facilities (in C
or in GDB) for finding the size of a malloc block; since the library
may round up the size of the block, it might be impossible to do
without changing the heap data structure.


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: gdb printing of dynamically allocated matrix
  2007-07-23 17:05           ` Jim Blandy
@ 2007-07-23 21:38             ` Peter Toft
  0 siblings, 0 replies; 10+ messages in thread
From: Peter Toft @ 2007-07-23 21:38 UTC (permalink / raw)
  To: Jim Blandy; +Cc: gdb

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1440 bytes --]

On Mon, 23 Jul 2007, Jim Blandy wrote:

> 
> Peter Toft <pto@linuxbog.dk> writes:
> > On Fri, 20 Jul 2007, Jim Blandy wrote:
> >
> >> 
> >> Peter Toft <pto@linuxbog.dk> writes:
> >> >> (gdb) matprint c 2 3
> >> 
> >> Could you use sizeof to compute the dimensions automatically?  Or at
> >> least one of them?
> >
> > Dear Jim
> >
> > I think I understand which direction you are point me to, but
> > "sizeof" in GDB does not ring a bell here. In C yes, but in GDB no.
> >
> > Can you give me an example e.g. for 1D arrays? We might target this 
> > snippet befor we move to 2D matrices;
> >
> >   int *a;
> >   a=(int *)malloc(3*sizeof(int));
> >   a[0] = 1;
> >   a[1] = 6;
> >   a[2] = 8;
> 
> Ah, if you're allocating dynamically, then there's no way to do it
> using sizeof.

Clearly my focus is dynamic memory allocation.
 
> GDB supports the C 'sizeof' operator; in your example above, 'print
> sizeof (a)' will give you '4' or '8' or whatever is appropriate for a
> pointer on the program being debugged.  There are no facilities (in C
> or in GDB) for finding the size of a malloc block; since the library
> may round up the size of the block, it might be impossible to do
> without changing the heap data structure.

Ok - we are now on the same (memory) page :-)
I was just a bit confused by your answer.

-- 
Peter Toft, Ph.D. [pto@linuxbog.dk] http://petertoft.dk
Følg min Linux-blog på http://www.version2.dk/blogs/petertoft

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2007-07-23 19:22 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-07-18 17:59 gdb printing of dynamically allocated matrix Peter Toft
2007-07-18 19:32 ` Daniel Jacobowitz
2007-07-18 20:32   ` Peter Toft
2007-07-18 21:56     ` Peter Toft
2007-07-19  3:10       ` Daniel Jacobowitz
2007-07-20 18:48         ` Peter Toft
2007-07-20 19:08       ` Jim Blandy
2007-07-21 14:16         ` Peter Toft
2007-07-23 17:05           ` Jim Blandy
2007-07-23 21:38             ` Peter Toft

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox