Bitfields
Leutwein Tobias (BEG-PG/EES)
Tobias.Leutwein@de.bosch.com
Fri Jan 8 07:34:00 GMT 2010
Hello,
I wrote a program that uses the gdb to get the address and type of global values. I use the gdb therefore because so I mustn't care about the debug format. This works quiet well, accept for single bits and bitfields. Single bits aren't standard at C/C++, so I tried to solve the issue with bitfields first.
If I want to determine the address an type from the global values
flags.uc and flags.s9 from the program build from ./gdb/testsuite/gdb.base/bitfields.c.
gcc -g ./gdb/testsuite/gdb.base/bitfields.c -o ./zzz
gdb zzz
First I check if the variable flags exists through
(gdb) ptype flags
type = struct fields {
unsigned char uc;
int s1 : 1;
unsigned int u1 : 1;
int s2 : 2;
unsigned int u2 : 2;
int s3 : 3;
unsigned int u3 : 3;
int s9 : 9;
unsigned int u9 : 9;
signed char sc;
}
Next determine the type of flags.uc
(gdb) ptype flags.uc
type = unsigned char
Then the address of the value
(gdb) interpreter-exec mi2 "-data-evaluate-expression &flags.uc"
^done,value="0x402040 \"\""
The same for flags.s9:
(gdb) ptype flags.s9
type = int
-> No difference to a normal integer value. Also
(gdb) interpreter-exec mi2 "-data-evaluate-expression &flags.s9"
^done,value="0x402042"
shows no difference to a normal value.
At attachment ptype.diff is a source code patch for gdb7.0.1, which shows the bitpos and bitsize of values if they are not equal to 0. This patch changes only the behaviour at c/c++ language.
tar -xf gdb-7.0.1.tar.bz2
cd gdb-7.0.1
patch -u -i ../gdb.diff -p1
./configure
make
gcc -g ./gdb/testsuite/gdb.base/bitfields.c -o ./zzz
gdb/gdb zzz
(gdb) ptype flags
type = struct fields {
unsigned char uc;
int s1 : 1;
unsigned int u1 : 1;
int s2 : 2;
unsigned int u2 : 2;
int s3 : 3;
unsigned int u3 : 3;
int s9 : 9;
unsigned int u9 : 9;
signed char sc;
}
(gdb) ptype flags.s9
type = int, bitpos = 20, bitsize = 9
(gdb) interpreter-exec mi2 "-data-evaluate-expression &flags.s9"
^done,value="0x402040"
(gdb) ptype flags.u9
type = unsigned int, bitsize = 9
(gdb) interpreter-exec mi2 "-data-evaluate-expression &flags.u9"
^done,value="0x402044"
(gdb) ptype flags.uc
type = unsigned char
(gdb) interpreter-exec mi2 "-data-evaluate-expression &flags.uc"
^done,value="0x402040 \"\""
I use the ptype command, because I didn't find a gdb/mi command through which I can get such informative results.
Would it be possible to extend the ptype command like I did?
Would it be better to make a new command?
Or is there a other way to get this information's.
Tobias
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ptype.diff
Type: application/octet-stream
Size: 59865 bytes
Desc: ptype.diff
URL: <http://sourceware.org/pipermail/gdb/attachments/20100108/18fb51ff/attachment.obj>
More information about the Gdb
mailing list