[LLVMdev] [lldb-dev] How is variable info retrieved in debugging for executables generated by llvm backend?
杨勇勇
triple.yang at gmail.com
Tue Feb 18 23:10:52 PST 2014
Sorry, this is the attachment.
2014-02-19 15:08 GMT+08:00 杨勇勇 <triple.yang at gmail.com>:
> 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)
>
--
杨勇勇 (Yang Yong-Yong)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140219/09066e6f/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: example.tar.bz2
Type: application/x-bzip2
Size: 4779 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140219/09066e6f/attachment.bin>
More information about the llvm-dev
mailing list