[lldb-dev] How is variable info retrieved in debugging for executables generated by llvm backend?
杨勇勇
triple.yang at gmail.com
Tue Feb 18 23:08:12 PST 2014
Thank you.
Here is an example and the attchment contains extra files including object
file and executable file.
I want to print for example the value of "a", but lldb command "frame
variable a" displays "0" and so does "b", and "c".
Meanwhile, the value is correct if I directly check registers or memory.
Following content is composed of three part:
1. C program.
2. assembly file including directives of dwarf debug info.
3. dwarf debug info dumpped from executable file with llvm-dwarfdump.
///////////////////////////////////////////////////////////////////////////////////////////
// C
int
main(int argc, char *argv[])
{
int a = 11;
int b = 22;
int c = a+b;
return c;
}
######################################
# asm including dwarf debugging info
.file "test.c"
.section .debug_info,"", at progbits
Lsection_info:
.section .debug_abbrev,"", at progbits
Lsection_abbrev:
.section .debug_aranges,"", at progbits
.section .debug_macinfo,"", at progbits
.section .debug_line,"", at progbits
Lsection_line:
.section .debug_loc,"", at progbits
.section .debug_pubtypes,"", at progbits
.section .debug_str,"MS", at progbits,1
Linfo_string:
.section .debug_ranges,"", at progbits
Ldebug_range:
.section .debug_loc,"", at progbits
Lsection_debug_loc:
.text
Ltext_begin:
.data
.file 1 "test.c"
.text
.global main
.type main, at function
main: # @main
Lfunc_begin0:
.loc 1 3 0 # test.c:3:0
# BB#0: # %entry
.loc 1 2 0 prologue_end # test.c:2:0
[SP + -4] = FP;;
[SP + -8] = J30;;
FP = SP;;
J31 = -40;;
SP = SP + J31;;
#DEBUG_VALUE: main:argc <- undef
#DEBUG_VALUE: main:argv <- undef
R2 = 0;;
R3 = 11;;
[FP + -12] = R2;;
[FP + -16] = R0;;
[FP + -20] = R1;;
.loc 1 4 0 # test.c:4:0
[FP + -24] = R3;;
R2 = 22;;
.loc 1 5 0 # test.c:5:0
[FP + -28] = R2;;
.loc 1 6 0 # test.c:6:0
R3 = [FP + -24];;
R2 = R3 + R2 (T);;
[FP + -32] = R2;;
.loc 1 7 0 # test.c:7:0
[FP + -36] = R0;;
R0 = R2;;
[FP + -40] = R1;;
SP = FP;;
J30 = [SP + -8];;
FP = [SP + -4];;
jump J30;;
Ltmp0:
Ltmp1:
.size main, Ltmp1-main
Lfunc_end0:
Ltext_end:
.data
Ldata_end:
.text
Lsection_end1:
.section .debug_info,"", at progbits
L.debug_info_begin0:
.int 148 # Length of Compilation Unit Info
.short 2 # DWARF version number
.int L.debug_abbrev_begin # Offset Into Abbrev. Section
.byte 4 # Address Size (in bytes)
.byte 1 # Abbrev [1] 0xb:0x8d DW_TAG_compile_unit
.int Linfo_string0 # DW_AT_producer
.short 12 # DW_AT_language
.int Linfo_string1 # DW_AT_name
.int 0 # DW_AT_low_pc
.int Lsection_line # DW_AT_stmt_list
.int Linfo_string2 # DW_AT_comp_dir
.byte 2 # Abbrev [2] 0x22:0x5d DW_TAG_subprogram
.int Linfo_string3 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 2 # DW_AT_decl_line
# DW_AT_prototyped
.int 127 # DW_AT_type
# DW_AT_external
.int Lfunc_begin0 # DW_AT_low_pc
.int Lfunc_end0 # DW_AT_high_pc
.byte 2 # DW_AT_frame_base
.byte 144
.byte 60
.byte 3 # Abbrev [3] 0x38:0xe DW_TAG_formal_parameter
.int Linfo_string5 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 2 # DW_AT_decl_line
.int 127 # DW_AT_type
.byte 2 # DW_AT_location
.byte 145
.byte 24
.byte 3 # Abbrev [3] 0x46:0xe DW_TAG_formal_parameter
.int Linfo_string6 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 2 # DW_AT_decl_line
.int 146 # DW_AT_type
.byte 2 # DW_AT_location
.byte 145
.byte 20
.byte 4 # Abbrev [4] 0x54:0xe DW_TAG_variable
.int Linfo_string8 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 4 # DW_AT_decl_line
.int 127 # DW_AT_type
.byte 2 # DW_AT_location
.byte 145
.byte 16
.byte 4 # Abbrev [4] 0x62:0xe DW_TAG_variable
.int Linfo_string9 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 5 # DW_AT_decl_line
.int 127 # DW_AT_type
.byte 2 # DW_AT_location
.byte 145
.byte 12
.byte 4 # Abbrev [4] 0x70:0xe DW_TAG_variable
.int Linfo_string10 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 6 # DW_AT_decl_line
.int 127 # DW_AT_type
.byte 2 # DW_AT_location
.byte 145
.byte 8
.byte 0 # End Of Children Mark
.byte 5 # Abbrev [5] 0x7f:0x7 DW_TAG_base_type
.int Linfo_string4 # DW_AT_name
.byte 5 # DW_AT_encoding
.byte 4 # DW_AT_byte_size
.byte 5 # Abbrev [5] 0x86:0x7 DW_TAG_base_type
.int Linfo_string7 # DW_AT_name
.byte 6 # DW_AT_encoding
.byte 1 # DW_AT_byte_size
.byte 6 # Abbrev [6] 0x8d:0x5 DW_TAG_pointer_type
.int 134 # DW_AT_type
.byte 6 # Abbrev [6] 0x92:0x5 DW_TAG_pointer_type
.int 141 # DW_AT_type
.byte 0 # End Of Children Mark
L.debug_info_end0:
.section .debug_abbrev,"", at progbits
L.debug_abbrev_begin:
.byte 1 # Abbreviation Code
.byte 17 # DW_TAG_compile_unit
.byte 1 # DW_CHILDREN_yes
.byte 37 # DW_AT_producer
.byte 14 # DW_FORM_strp
.byte 19 # DW_AT_language
.byte 5 # DW_FORM_data2
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.byte 17 # DW_AT_low_pc
.byte 1 # DW_FORM_addr
.byte 16 # DW_AT_stmt_list
.byte 6 # DW_FORM_data4
.byte 27 # DW_AT_comp_dir
.byte 14 # DW_FORM_strp
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 2 # Abbreviation Code
.byte 46 # DW_TAG_subprogram
.byte 1 # DW_CHILDREN_yes
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.byte 58 # DW_AT_decl_file
.byte 11 # DW_FORM_data1
.byte 59 # DW_AT_decl_line
.byte 11 # DW_FORM_data1
.byte 39 # DW_AT_prototyped
.byte 25 # DW_FORM_flag_present
.byte 73 # DW_AT_type
.byte 19 # DW_FORM_ref4
.byte 63 # DW_AT_external
.byte 25 # DW_FORM_flag_present
.byte 17 # DW_AT_low_pc
.byte 1 # DW_FORM_addr
.byte 18 # DW_AT_high_pc
.byte 1 # DW_FORM_addr
.byte 64 # DW_AT_frame_base
.byte 10 # DW_FORM_block1
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 3 # Abbreviation Code
.byte 5 # DW_TAG_formal_parameter
.byte 0 # DW_CHILDREN_no
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.byte 58 # DW_AT_decl_file
.byte 11 # DW_FORM_data1
.byte 59 # DW_AT_decl_line
.byte 11 # DW_FORM_data1
.byte 73 # DW_AT_type
.byte 19 # DW_FORM_ref4
.byte 2 # DW_AT_location
.byte 10 # DW_FORM_block1
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 4 # Abbreviation Code
.byte 52 # DW_TAG_variable
.byte 0 # DW_CHILDREN_no
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.byte 58 # DW_AT_decl_file
.byte 11 # DW_FORM_data1
.byte 59 # DW_AT_decl_line
.byte 11 # DW_FORM_data1
.byte 73 # DW_AT_type
.byte 19 # DW_FORM_ref4
.byte 2 # DW_AT_location
.byte 10 # DW_FORM_block1
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 5 # Abbreviation Code
.byte 36 # DW_TAG_base_type
.byte 0 # DW_CHILDREN_no
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.byte 62 # DW_AT_encoding
.byte 11 # DW_FORM_data1
.byte 11 # DW_AT_byte_size
.byte 11 # DW_FORM_data1
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 6 # Abbreviation Code
.byte 15 # DW_TAG_pointer_type
.byte 0 # DW_CHILDREN_no
.byte 73 # DW_AT_type
.byte 19 # DW_FORM_ref4
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 0 # EOM(3)
L.debug_abbrev_end:
.section .debug_aranges,"", at progbits
.section .debug_ranges,"", at progbits
.section .debug_macinfo,"", at progbits
.section .debug_str,"MS", at progbits,1
Linfo_string0:
.asciz "clang version 3.3 (/opt/git.repo/clang.git/
b422d20530588813b09057b45d5b383f0b175ced) (/opt/git.repo/llvm.git/
57b428f0a6be7b81bc364b0088992b1f820b516e)"
Linfo_string1:
.asciz "test.c"
Linfo_string2:
.asciz "/home/yangyy/workspace/newlib"
Linfo_string3:
.asciz "main"
Linfo_string4:
.asciz "int"
Linfo_string5:
.asciz "argc"
Linfo_string6:
.asciz "argv"
Linfo_string7:
.asciz "char"
Linfo_string8:
.asciz "a"
Linfo_string9:
.asciz "b"
Linfo_string10:
.asciz "c"
#########################################
# dwarf debug info dumpped from its executable file with llvm-dwarfdump
mspu.out: file format ELF32-mspu
.debug_abbrev contents:
Abbrev table for offset: 0x00000000
[1] DW_TAG_compile_unit DW_CHILDREN_yes
DW_AT_producer DW_FORM_strp
DW_AT_language DW_FORM_data2
DW_AT_name DW_FORM_strp
DW_AT_low_pc DW_FORM_addr
DW_AT_stmt_list DW_FORM_data4
DW_AT_comp_dir DW_FORM_strp
[2] DW_TAG_subprogram DW_CHILDREN_yes
DW_AT_name DW_FORM_strp
DW_AT_decl_file DW_FORM_data1
DW_AT_decl_line DW_FORM_data1
DW_AT_prototyped DW_FORM_flag_present
DW_AT_type DW_FORM_ref4
DW_AT_external DW_FORM_flag_present
DW_AT_low_pc DW_FORM_addr
DW_AT_high_pc DW_FORM_addr
DW_AT_frame_base DW_FORM_block1
[3] DW_TAG_formal_parameter DW_CHILDREN_no
DW_AT_name DW_FORM_strp
DW_AT_decl_file DW_FORM_data1
DW_AT_decl_line DW_FORM_data1
DW_AT_type DW_FORM_ref4
DW_AT_location DW_FORM_block1
[4] DW_TAG_variable DW_CHILDREN_no
DW_AT_name DW_FORM_strp
DW_AT_decl_file DW_FORM_data1
DW_AT_decl_line DW_FORM_data1
DW_AT_type DW_FORM_ref4
DW_AT_location DW_FORM_block1
[5] DW_TAG_base_type DW_CHILDREN_no
DW_AT_name DW_FORM_strp
DW_AT_encoding DW_FORM_data1
DW_AT_byte_size DW_FORM_data1
[6] DW_TAG_pointer_type DW_CHILDREN_no
DW_AT_type DW_FORM_ref4
.debug_info contents:
0x00000000: Compile Unit: length = 0x00000094 version = 0x0002 abbr_offset
= 0x0000 addr_size = 0x04 (next CU at 0x00000098)
0x0000000b: DW_TAG_compile_unit [1] *
0x0000000c: DW_AT_producer [DW_FORM_strp] ( .debug_str[0x00000000] =
"clang version 3.3 (/opt/git.repo/clang.git/
b422d20530588813b09057b45d5b383f0b175ced) (/opt/git.repo/llvm.git/
57b428f0a6be7b81bc364b0088992b1f820b516e)")
0x00000010: DW_AT_language [DW_FORM_data2] (0x000c)
0x00000012: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000099] = "test.c")
0x00000016: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
0x0000001a: DW_AT_stmt_list [DW_FORM_data4] (0x00000000)
0x0000001e: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x000000a0] =
"/home/yangyy/workspace/newlib")
0x00000022: DW_TAG_subprogram [2] *
0x00000023: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000be] = "main")
0x00000027: DW_AT_decl_file [DW_FORM_data1] (0x01)
0x00000028: DW_AT_decl_line [DW_FORM_data1] (0x02)
0x00000029: DW_AT_prototyped [DW_FORM_flag_present] (true)
0x00000029: DW_AT_type [DW_FORM_ref4] (cu + 0x007f => {0x0000007f})
0x0000002d: DW_AT_external [DW_FORM_flag_present] (true)
0x0000002d: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000028)
0x00000031: DW_AT_high_pc [DW_FORM_addr] (0x0000000000000084)
0x00000035: DW_AT_frame_base [DW_FORM_block1] (<0x02> 90 3c )
0x00000038: DW_TAG_formal_parameter [3]
0x00000039: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000c7] =
"argc")
0x0000003d: DW_AT_decl_file [DW_FORM_data1] (0x01)
0x0000003e: DW_AT_decl_line [DW_FORM_data1] (0x02)
0x0000003f: DW_AT_type [DW_FORM_ref4] (cu + 0x007f => {0x0000007f})
0x00000043: DW_AT_location [DW_FORM_block1] (<0x02> 91 18 )
0x00000046: DW_TAG_formal_parameter [3]
0x00000047: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000cc] =
"argv")
0x0000004b: DW_AT_decl_file [DW_FORM_data1] (0x01)
0x0000004c: DW_AT_decl_line [DW_FORM_data1] (0x02)
0x0000004d: DW_AT_type [DW_FORM_ref4] (cu + 0x0092 => {0x00000092})
0x00000051: DW_AT_location [DW_FORM_block1] (<0x02> 91 14 )
0x00000054: DW_TAG_variable [4]
0x00000055: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000d6] = "a")
0x00000059: DW_AT_decl_file [DW_FORM_data1] (0x01)
0x0000005a: DW_AT_decl_line [DW_FORM_data1] (0x04)
0x0000005b: DW_AT_type [DW_FORM_ref4] (cu + 0x007f => {0x0000007f})
0x0000005f: DW_AT_location [DW_FORM_block1] (<0x02> 91 10 )
0x00000062: DW_TAG_variable [4]
0x00000063: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000d8] = "b")
0x00000067: DW_AT_decl_file [DW_FORM_data1] (0x01)
0x00000068: DW_AT_decl_line [DW_FORM_data1] (0x05)
0x00000069: DW_AT_type [DW_FORM_ref4] (cu + 0x007f => {0x0000007f})
0x0000006d: DW_AT_location [DW_FORM_block1] (<0x02> 91 0c )
0x00000070: DW_TAG_variable [4]
0x00000071: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000da] = "c")
0x00000075: DW_AT_decl_file [DW_FORM_data1] (0x01)
0x00000076: DW_AT_decl_line [DW_FORM_data1] (0x06)
0x00000077: DW_AT_type [DW_FORM_ref4] (cu + 0x007f => {0x0000007f})
0x0000007b: DW_AT_location [DW_FORM_block1] (<0x02> 91 08 )
0x0000007e: NULL
0x0000007f: DW_TAG_base_type [5]
0x00000080: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000c3] = "int")
0x00000084: DW_AT_encoding [DW_FORM_data1] (0x05)
0x00000085: DW_AT_byte_size [DW_FORM_data1] (0x04)
0x00000086: DW_TAG_base_type [5]
0x00000087: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000d1] = "char")
0x0000008b: DW_AT_encoding [DW_FORM_data1] (0x06)
0x0000008c: DW_AT_byte_size [DW_FORM_data1] (0x01)
0x0000008d: DW_TAG_pointer_type [6]
0x0000008e: DW_AT_type [DW_FORM_ref4] (cu + 0x0086 => {0x00000086})
0x00000092: DW_TAG_pointer_type [6]
0x00000093: DW_AT_type [DW_FORM_ref4] (cu + 0x008d => {0x0000008d})
0x00000097: NULL
.debug_frame contents:
.debug_aranges contents:
.debug_line contents:
Line table prologue:
total_length: 0x00000037
version: 2
prologue_length: 0x0000001d
min_inst_length: 1
default_is_stmt: 1
line_base: -5
line_range: 14
opcode_base: 13
standard_opcode_lengths[DW_LNS_copy] = 0
standard_opcode_lengths[DW_LNS_advance_pc] = 1
standard_opcode_lengths[DW_LNS_advance_line] = 1
standard_opcode_lengths[DW_LNS_set_file] = 1
standard_opcode_lengths[DW_LNS_set_column] = 1
standard_opcode_lengths[DW_LNS_negate_stmt] = 0
standard_opcode_lengths[DW_LNS_set_basic_block] = 0
standard_opcode_lengths[DW_LNS_const_add_pc] = 0
standard_opcode_lengths[DW_LNS_fixed_advance_pc] = 1
standard_opcode_lengths[DW_LNS_set_prologue_end] = 0
standard_opcode_lengths[DW_LNS_set_epilogue_begin] = 0
standard_opcode_lengths[DW_LNS_set_isa] = 1
Dir Mod Time File Len File Name
---- ---------- ---------- ---------------------------
file_names[ 1] 0 0x00000000 0x00000000 test.c
Address Line Column File ISA Flags
------------------ ------ ------ ------ --- -------------
0x0000000000000028 2 0 1 0 is_stmt prologue_end
0x0000000000000050 4 0 1 0 is_stmt
0x0000000000000058 5 0 1 0 is_stmt
0x000000000000005c 6 0 1 0 is_stmt
0x0000000000000068 7 0 1 0 is_stmt
0x0000000000000084 7 0 1 0 is_stmt end_sequence
.debug_str contents:
0x00000000: "clang version 3.3 (/opt/git.repo/clang.git/
b422d20530588813b09057b45d5b383f0b175ced) (/opt/git.repo/llvm.git/
57b428f0a6be7b81bc364b0088992b1f820b516e)"
0x00000099: "test.c"
0x000000a0: "/home/yangyy/workspace/newlib"
0x000000be: "main"
0x000000c3: "int"
0x000000c7: "argc"
0x000000cc: "argv"
0x000000d1: "char"
0x000000d6: "a"
0x000000d8: "b"
0x000000da: "c"
.debug_ranges contents:
.debug_pubnames contents:
Length: 0
Version: 0
Offset in .debug_info: 0
Size: 0
Offset Name
.debug_abbrev.dwo contents:
< EMPTY >
2014-02-19 2:28 GMT+08:00 Greg Clayton <gclayton at apple.com>:
> All of this information is contained in the DWARF debug info that you must
> generate. Are you generating DWARF? If not, you will need to. If so, please
> attach an example program that contains DWARF and specify which function
> you are having trouble getting variable information for.
>
> Greg Clayton
>
> On Feb 18, 2014, at 12:44 AM, 杨勇勇 <triple.yang at gmail.com> wrote:
>
> > Hi, all
> >
> > I ported llvm backend and lldb recently. Both tools can basically work.
> > lldb is able to debug programs in asm style and frame unwinding is OK.
> >
> > But "frame variable XX" does not work because lldb is not able to
> determine the address of
> > XX from debug info.
> >
> > Can someone give any clue?
> > Thanks in advance.
> >
> > --
> > 杨勇勇 (Yang Yong-Yong)
> > _______________________________________________
> > lldb-dev mailing list
> > lldb-dev at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>
>
--
杨勇勇 (Yang Yong-Yong)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20140219/07f9e390/attachment.html>
More information about the lldb-dev
mailing list