This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: value of local variable stored in register


Hi,

Since the live range of value 'c' is dead after printf, the compiler
may be discarding it.
Try to use something like b = c + 200; after printf statement, so that
we extend the live range of variable 'c'.

Regards,
Rohit

On Feb 4, 2008 12:32 PM, Rohit Arul Raj <rohitarulraj@gmail.com> wrote:
> Hi,
>
> Then, the register value is getting corrupted due to the segmentation fault.
> Try to set the break-point before the *a = 0 statement, and try to get
> the register info and local variable info.
>
> Regards,
> Rohit
>
>
> On Feb 4, 2008 12:09 PM, Neeraj kushwaha <kushneeraj@gmail.com> wrote:
> >
> > Hi Rohit,
> >
> > thanks for the reply.
> >
> > segmentation occurs due to unreferencing null pointer. (this was done
> > intensionally)
> > I am running gdb on core dump.
> >
> > My main intention to get the value of the local variable stored in register.
> > From the dwarf dump information i can say it was stored in DW_OP_reg2.
> >
> > Also if for the arithmetic operations, data is moved to register from
> > memory, but when the printf function returns all the saved register
> > value should be restored.
> >
> > this is the dwarf information extracted from a.out
> >
> > <1><  276>      DW_TAG_subprogram
> >                DW_AT_sibling               <341>
> >                DW_AT_external              yes(1)
> >                DW_AT_name                  main
> >                DW_AT_decl_file             1
> > /home/neeraj/SSG/Release2/gdblocal/2.c
> >                DW_AT_decl_line             5
> >                DW_AT_type                  <199>
> >                DW_AT_low_pc                0x80483a4
> >                DW_AT_high_pc               0x80483f5
> >                DW_AT_frame_base            [
> > 0]<lowpc=0x0><highpc=0x4>DW_OP_breg4+4
> >                                        [ 1]<lowpc=0x4><highpc=0xa>DW_OP_reg1
> >                                        [ 2]<lowpc=0xa><highpc=0xb>DW_OP_breg4+4
> >                                        [ 3]<lowpc=0xb><highpc=0xd>DW_OP_breg4+8
> >                                        [
> > 4]<lowpc=0xd><highpc=0x51>DW_OP_breg5+8
> > <2><  305>      DW_TAG_variable
> >                DW_AT_name                  a
> >                DW_AT_decl_file             1
> > /home/neeraj/SSG/Release2/gdblocal/2.c
> >                DW_AT_decl_line             6
> >                DW_AT_type                  <341>
> >                DW_AT_location              DW_OP_fbreg -16
> > <2><  317>      DW_TAG_variable
> >                DW_AT_name                  b
> >                DW_AT_decl_file             1
> > /home/neeraj/SSG/Release2/gdblocal/2.c
> >                DW_AT_decl_line             7
> >                DW_AT_type                  <347>
> >                DW_AT_location              DW_OP_fbreg -20
> > <2><  329>      DW_TAG_variable
> >                DW_AT_name                  c
> >                DW_AT_decl_file             1
> > /home/neeraj/SSG/Release2/gdblocal/2.c
> >                DW_AT_decl_line             8
> >                DW_AT_type                  <199>
> >                DW_AT_location              DW_OP_reg2
> > <1><  341>      DW_TAG_pointer_type
> >                DW_AT_byte_size             4
> >                DW_AT_type                  <199>
> > <1><  347>      DW_TAG_volatile_type
> >                DW_AT_type                  <199>
> >
> > Regards
> > Neeraj
> >
> > On Feb 4, 2008 10:58 AM, Rohit Arul Raj <rohitarulraj@gmail.com> wrote:
> >
> > > Hi,
> > >
> > > 1. You are getting segmentation fault because of trying to write to a
> > > invalid memory location (0x0) through pointer a;
> > > 2. It is not always true that if u give the storage class specifier as
> > > "Register", a register will be allocated for the local variable. It
> > > always depends on the compiler.
> > > 3. It is possible that for arithmetic operations, the compiler may
> > > move your data to register from memory (operation: b*c & your
> > > arithmetic operations does not support memory operands). In that case
> > > u can look at the assembly generated.
> > >
> > > Regards,
> > > Rohit
> > >
> > >
> > > On Feb 4, 2008 10:23 AM, Neeraj kushwaha <kushneeraj@gmail.com> wrote:
> > > > Hi All,
> > > >
> > > > I am trying to find the value of local variable stored in register.
> > > > But I am getting wrong value from gdb.
> > > > Here what i am trying
> > > >
> > > > #include<stdio.h>
> > > >
> > > > int main()
> > > > {
> > > > int *a=0;
> > > > volatile register int b=0xabcd;
> > > >  register int c=20;
> > > > printf("%x\n",b*c);
> > > > *a=0;
> > > > return 0;
> > > > }
> > > >
> > > >
> > > > ------------------------------
> > > > -----------------------
> > > > GDB info:
> > > >
> > > > Core was generated by `./a.out'.
> > > > Program terminated with signal 11, Segmentation fault.
> > > >  #0  0x080483e1 in main () at 1.c:9
> > > > 9       *a=0;
> > > > (gdb) info local
> > > > a = (int *) 0x0
> > > > b = 43981
> > > > c = 11305136
> > > > (gdb) info reg
> > > > eax            0x0      0
> > > > ecx            0x0      0
> > > > edx            0xac80b0 11305136
> > > >  ebx            0xac6ff4 11300852
> > > > esp            0xbfc65a00       0xbfc65a00
> > > > ebp            0xbfc65a28       0xbfc65a28
> > > > esi            0x973ca0 9911456
> > > > edi            0x0      0
> > > > eip            0x80483e1        0x80483e1 <main+61>
> > > >  eflags         0x210282 [ SF IF RF ID ]
> > > > cs             0x73     115
> > > > ss             0x7b     123
> > > > ds             0x7b     123
> > > > es             0x7b     123
> > > > fs             0x0      0
> > > > gs             0x33     51
> > > >  (gdb)
> > > >
> > > >
> > > > The value of local variable is shown as c = 11305136, but actual value is 20.
> > > >
> > > > How to get the correct value of variables which are stored in register.
> > > >
> > > > Regards
> > > > Neeraj
> > > >
> > >
> >
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]