[Dwarf-Discuss] find local variable information from the dwarf

Neeraj kushwaha kushneeraj at gmail.com
Sun Jan 20 21:23:03 PST 2008


Hi All,

I am trying to find the location and value of local variable in a stack
frame from the core dump.
As GDB can fetch the value and location of local variable using the
information from the dwarf debugging format.

I am trying to manually find the location and value of the local variable
from the core.

This is what i did; from the a.out, I extracted the dwarf information using
"dwarfdump -a a.out"

and using the GDB i am trying to print the dump from the core "x/88b main1"

But I am not able to find the location information of the local variable

for example:

        DW_AT_name                  c
        DW_AT_decl_file             1 /home/neeraj/4.c
        DW_AT_decl_line             15
        DW_AT_type                  <177>
        DW_AT_location              DW_OP_fbreg -20


local variable is at location DW_OP_fbreg - 20. But how to find the
DW_OP_fbreg?

Secondly I don't see the local variable are word aligned.

Please anyone guide me how to find the location and value of local variable
from the dwarf format and looking at the dump.

I am putting all the information here. (source code, gdb dump, dwarf
information)

/* 4.c */
#include<stdio.h>

int main1()
{
int b=0xabccddef;
int *p=0;
*p=10;
return 0;
}

int main()
{
int c=0xeeffeeff;
int ab=0xaabbccdd;
main1();
return 0;
}

-----------------------------------------------------------------------

(gdb) x/88b main1
0x8048374 <main1>:      0x55    0x89    0xe5    0x83    0xec    0x10
0xc7    0x45
0x804837c <main1+8>:    0xf8    0xef    0xdd    0xcc    0xab    0xc7
0x45    0xfc
0x8048384 <main1+16>:   0x00    0x00    0x00    0x00    0x8b    0x45
0xfc    0xc7
0x804838c <main1+24>:   0x00    0x0a    0x00    0x00    0x00    0xb8
0x00    0x00
0x8048394 <main1+32>:   0x00    0x00    0xc9    0xc3    0x8d    0x4c
0x24    0x04
0x804839c <main+4>:     0x83    0xe4    0xf0    0xff    0x71    0xfc
0x55    0x89
0x80483a4 <main+12>:    0xe5    0x51    0x83    0xec    0x10    0xc7
0x45    0xf4
0x80483ac <main+20>:    0xff    0xee    0xff    0xee    0xc7    0x45
0xf8    0xdd
0x80483b4 <main+28>:    0xcc    0xbb    0xaa    0xe8    0xb8    0xff
0xff    0xff
0x80483bc <main+36>:    0xb8    0x00    0x00    0x00    0x00    0x83
0xc4    0x10
0x80483c4 <main+44>:    0x59    0x5d    0x8d    0x61    0xfc    0xc3
0x90    0x90

-------------------------------------------------------------------------------------------


.debug_info

COMPILE_UNIT<header overall offset = 0>:
<0><   11>    DW_TAG_compile_unit
        DW_AT_stmt_list             0
        DW_AT_high_pc               0x80483ca
        DW_AT_low_pc                0x8048374
        DW_AT_producer              GNU C 4.1.2 20070925 (Red Hat 4.1.2-27)
        DW_AT_language              DW_LANG_C89
        DW_AT_name                  4.c
        DW_AT_comp_dir              /home/neeraj

LOCAL_SYMBOLS:
<1><   82>    DW_TAG_base_type
        DW_AT_name                  unsigned int
        DW_AT_byte_size             4
        DW_AT_encoding              DW_ATE_unsigned
<1><   89>    DW_TAG_base_type
        DW_AT_name                  unsigned char
        DW_AT_byte_size             1
        DW_AT_encoding              DW_ATE_unsigned_char
<1><  106>    DW_TAG_base_type
        DW_AT_name                  short unsigned int
        DW_AT_byte_size             2
        DW_AT_encoding              DW_ATE_unsigned
<1><  128>    DW_TAG_base_type
        DW_AT_name                  long unsigned int
        DW_AT_byte_size             4
        DW_AT_encoding              DW_ATE_unsigned
<1><  149>    DW_TAG_base_type
        DW_AT_name                  signed char
        DW_AT_byte_size             1
        DW_AT_encoding              DW_ATE_signed_char
<1><  164>    DW_TAG_base_type
        DW_AT_name                  short int
        DW_AT_byte_size             2
        DW_AT_encoding              DW_ATE_signed
<1><  177>    DW_TAG_base_type
        DW_AT_name                  int
        DW_AT_byte_size             4
        DW_AT_encoding              DW_ATE_signed
<1><  184>    DW_TAG_base_type
        DW_AT_name                  long long int
        DW_AT_byte_size             8
        DW_AT_encoding              DW_ATE_signed
<1><  201>    DW_TAG_base_type
        DW_AT_name                  long long unsigned int
        DW_AT_byte_size             8
        DW_AT_encoding              DW_ATE_unsigned
<1><  227>    DW_TAG_base_type
        DW_AT_name                  long int
        DW_AT_byte_size             4
        DW_AT_encoding              DW_ATE_signed
<1><  239>    DW_TAG_base_type
        DW_AT_name                  unsigned int
        DW_AT_byte_size             4
        DW_AT_encoding              DW_ATE_unsigned
<1><  246>    DW_TAG_base_type
        DW_AT_name                  char
        DW_AT_byte_size             1
        DW_AT_encoding              DW_ATE_signed_char
<1><  254>    DW_TAG_subprogram
        DW_AT_sibling               <309>
        DW_AT_external              yes(1)
        DW_AT_name                  main1
        DW_AT_decl_file             1 /home/neeraj/4.c
        DW_AT_decl_line             6
        DW_AT_type                  <177>
        DW_AT_low_pc                0x8048374
        DW_AT_high_pc               0x8048398
        DW_AT_frame_base            [ 0]<lowpc=0x0><highpc=0x1>DW_OP_breg4+4
                    [ 1]<lowpc=0x1><highpc=0x3>DW_OP_breg4+8
                    [ 2]<lowpc=0x3><highpc=0x24>DW_OP_breg5+8
<2><  284>    DW_TAG_variable
        DW_AT_name                  b
        DW_AT_decl_file             1 /home/neeraj/4.c
        DW_AT_decl_line             7
        DW_AT_type                  <177>
        DW_AT_location              DW_OP_fbreg -16
<2><  296>    DW_TAG_variable
        DW_AT_name                  p
        DW_AT_decl_file             1 /home/neeraj/4.c
        DW_AT_decl_line             8
        DW_AT_type                  <309>
        DW_AT_location              DW_OP_fbreg -12
<1><  309>    DW_TAG_pointer_type
        DW_AT_byte_size             4
        DW_AT_type                  <177>
<1><  315>    DW_TAG_subprogram
        DW_AT_external              yes(1)
        DW_AT_name                  main
        DW_AT_decl_file             1 /home/neeraj/4.c
        DW_AT_decl_line             14
        DW_AT_type                  <177>
        DW_AT_low_pc                0x8048398
        DW_AT_high_pc               0x80483ca
        DW_AT_frame_base            [
0]<lowpc=0x24><highpc=0x28>DW_OP_breg4+4
                    [ 1]<lowpc=0x28><highpc=0x2e>DW_OP_reg1
                    [ 2]<lowpc=0x2e><highpc=0x2f>DW_OP_breg4+4
                    [ 3]<lowpc=0x2f><highpc=0x31>DW_OP_breg4+8
                    [ 4]<lowpc=0x31><highpc=0x56>DW_OP_breg5+8
<2><  340>    DW_TAG_variable
        DW_AT_name                  c
        DW_AT_decl_file             1 /home/neeraj/4.c
        DW_AT_decl_line             15
        DW_AT_type                  <177>
        DW_AT_location              DW_OP_fbreg -20
<2><  352>    DW_TAG_variable
        DW_AT_name                  ab
        DW_AT_decl_file             1 /home/neeraj/4.c
        DW_AT_decl_line             16
        DW_AT_type                  <177>
        DW_AT_location              DW_OP_fbreg -16

line number info
<source>    [row,column]    <pc>    //<new statement or basic block
/home/neeraj/4.c:    [  6,-1]    0x8048374    // new statement
/home/neeraj/4.c:    [  7,-1]    0x804837a    // new statement
/home/neeraj/4.c:    [  8,-1]    0x8048381    // new statement
/home/neeraj/4.c:    [  9,-1]    0x8048388    // new statement
/home/neeraj/4.c:    [ 10,-1]    0x8048391    // new statement
/home/neeraj/4.c:    [ 11,-1]    0x8048396    // new statement
/home/neeraj/4.c:    [ 14,-1]    0x8048398    // new statement
/home/neeraj/4.c:    [ 15,-1]    0x8048398    // new statement
/home/neeraj/4.c:    [ 16,-1]    0x804839f    // new statement
/home/neeraj/4.c:    [ 17,-1]    0x80483a6    // new statement
/home/neeraj/4.c:    [ 18,-1]    0x80483ab    // new statement
/home/neeraj/4.c:    [ 19,-1]    0x80483b0    // new statement
/home/neeraj/4.c:    [ 19,-1]    0x80483b0    // new statement    // end of
text sequence

.debug_pubnames
global main1           die 254, cu-die 11, off-in-cu 254, cu 0
global main            die 315, cu-die 11, off-in-cu 315, cu 0

.debug_macinfo

.debug_loc format <o b e l> means section-offset begin-addr end-addr
length-of-block-entry
     <obel> 0x00000000 0x000000000 0x00000001        2
     <obel> 0x0000000c 0x000000001 0x00000003        2
     <obel> 0x00000018 0x000000003 0x00000024        2
     <obel> 0x00000024 0x000000000 0x00000000        0
     <obel> 0x0000002c 0x000000024 0x00000028        2
     <obel> 0x00000038 0x000000028 0x0000002e        1
     <obel> 0x00000043 0x00000002e 0x0000002f        2
     <obel> 0x0000004f 0x00000002f 0x00000031        2
     <obel> 0x0000005b 0x000000031 0x00000056        2
     <obel> 0x00000067 0x000000000 0x00000000        0

.debug_abbrev
<   1><    0><code:  1> DW_TAG_compile_unit DW_children_yes
      <    3>    DW_AT_stmt_list             DW_FORM_data4
      <    5>    DW_AT_high_pc               DW_FORM_addr
      <    7>    DW_AT_low_pc                DW_FORM_addr
      <    9>    DW_AT_producer              DW_FORM_string
      <   11>    DW_AT_language              DW_FORM_data1
      <   13>    DW_AT_name                  DW_FORM_string
      <   15>    DW_AT_comp_dir              DW_FORM_string
<   2><   19><code:  2> DW_TAG_base_type    DW_children_no
      <   22>    DW_AT_name                  DW_FORM_strp
      <   24>    DW_AT_byte_size             DW_FORM_data1
      <   26>    DW_AT_encoding              DW_FORM_data1
<   3><   30><code:  3> DW_TAG_base_type    DW_children_no
      <   33>    DW_AT_name                  DW_FORM_string
      <   35>    DW_AT_byte_size             DW_FORM_data1
      <   37>    DW_AT_encoding              DW_FORM_data1
<   4><   41><code:  4> DW_TAG_subprogram   DW_children_yes
      <   44>    DW_AT_sibling               DW_FORM_ref4
      <   46>    DW_AT_external              DW_FORM_flag
      <   48>    DW_AT_name                  DW_FORM_string
      <   50>    DW_AT_decl_file             DW_FORM_data1
      <   52>    DW_AT_decl_line             DW_FORM_data1
      <   54>    DW_AT_type                  DW_FORM_ref4
      <   56>    DW_AT_low_pc                DW_FORM_addr
      <   58>    DW_AT_high_pc               DW_FORM_addr
      <   60>    DW_AT_frame_base            DW_FORM_data4
<   5><   64><code:  5> DW_TAG_variable     DW_children_no
      <   67>    DW_AT_name                  DW_FORM_string
      <   69>    DW_AT_decl_file             DW_FORM_data1
      <   71>    DW_AT_decl_line             DW_FORM_data1
      <   73>    DW_AT_type                  DW_FORM_ref4
      <   75>    DW_AT_location              DW_FORM_block1
<   6><   79><code:  6> DW_TAG_pointer_type DW_children_no
      <   82>    DW_AT_byte_size             DW_FORM_data1
      <   84>    DW_AT_type                  DW_FORM_ref4
<   7><   88><code:  7> DW_TAG_subprogram   DW_children_yes
      <   91>    DW_AT_external              DW_FORM_flag
      <   93>    DW_AT_name                  DW_FORM_string
      <   95>    DW_AT_decl_file             DW_FORM_data1
      <   97>    DW_AT_decl_line             DW_FORM_data1
      <   99>    DW_AT_type                  DW_FORM_ref4
      <  101>    DW_AT_low_pc                DW_FORM_addr
      <  103>    DW_AT_high_pc               DW_FORM_addr
      <  105>    DW_AT_frame_base            DW_FORM_data4
<   8><  109><code:  0> null .debug_abbrev entry

.debug_string
name at offset 0, length 12 is unsigned int

.debug_aranges

arange starts at 8048374, length of 86, cu_die_offset = 11

COMPILE_UNIT<header overall offset = 0>:
<0><   11>    DW_TAG_compile_unit
        DW_AT_stmt_list             0
        DW_AT_high_pc               0x80483ca
        DW_AT_low_pc                0x8048374
        DW_AT_producer              GNU C 4.1.2 20070925 (Red Hat 4.1.2-27)
        DW_AT_language              DW_LANG_C89
        DW_AT_name                  4.c
        DW_AT_comp_dir              /home/neeraj

.debug_frame

fde:
<  0><0x8048374:0x8048398><main1><fde offset 0x14 length: 0x14><eh offset
none>
    08048374:    cfa=04(r4/a0) r8/t0=-4(cfa)
    08048375:    cfa=08(r4/a0) r5/a1=-8(cfa) r8/t0=-4(cfa)
    08048377:    cfa=08(r5/a1) r5/a1=-8(cfa) r8/t0=-4(cfa)
<  0><0x8048398:0x80483ca><main><fde offset 0x2c length: 0x24><eh offset
none>
    08048398:    cfa=04(r4/a0) r8/t0=-4(cfa)
    0804839c:    cfa=00(r1/at) r4/a0=r1/at r8/t0=-4(cfa)
    080483a2:    cfa=04(r4/a0) r4/a0=r1/at r8/t0=-4(cfa)
    080483a3:    cfa=08(r4/a0) r4/a0=r1/at r5/a1=-8(cfa) r8/t0=-4(cfa)
    080483a5:    cfa=08(r5/a1) r4/a0=r1/at r5/a1=-8(cfa) r8/t0=-4(cfa)
    080483a6:    cfa=08(r5/a1) r4/a0=-12(cfa) r5/a1=-8(cfa) r8/t0=-4(cfa)

.eh_frame

fde:
<  0><0xfffffee8:0xffffff51><><fde offset 0x8c length: 0x1c><eh offset none>
    fffffee8:    cfa=04(r4/a0) r8/t0=-4(cfa)
    fffffee9:    cfa=08(r4/a0) r5/a1=-8(cfa) r8/t0=-4(cfa)
    fffffeeb:    cfa=08(r5/a1) r5/a1=-8(cfa) r8/t0=-4(cfa)
    fffffeee:    cfa=08(r5/a1) r3/v1=-20(cfa) r5/a1=-8(cfa) r6/a2=-16(cfa)
r7/a3=-12(cfa) r8/t0=-4(cfa)
<  0><0xfffffef4:0xfffffef9><><fde offset 0x70 length: 0x18><eh offset none>
    fffffef4:    cfa=04(r4/a0) r8/t0=-4(cfa)
    fffffef5:    cfa=08(r4/a0) r5/a1=-8(cfa) r8/t0=-4(cfa)
    fffffef7:    cfa=08(r5/a1) r5/a1=-8(cfa) r8/t0=-4(cfa)

.debug_static_func

.debug_static_vars

.debug_types

.debug_weaknames


--------------------------------------------------------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dwarfstd.org/private.cgi/dwarf-discuss-dwarfstd.org/attachments/20080121/a9995fc1/attachment-0001.htm>


More information about the Dwarf-Discuss mailing list