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