This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
Re: value of local variable stored in register
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
> > >
> >
>