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 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
> >
>