arch/arm/kernel/setup.c does not compile at -O0
Mason
slash.tmp at free.fr
Thu Jul 30 07:54:57 PDT 2015
On 30/07/2015 15:58, Mason wrote:
> On 30/07/2015 15:14, Robin Murphy wrote:
>
>> On 30/07/15 13:53, Mason wrote:
>>
>>> Any idea how I can get DS-5 to properly handle local variables?
>>
>> I carry a patch locally reverting 2062afb4f804 - at least on arm64, the
>> debugger manages to resolve optimised locals considerably better without
>> the -fno-var-tracking-assignments option. The Kconfig "Generate dwarf4
>> debug info" option is a good idea, and "Generate readable assembly code"
>> sometimes helps a bit too.
>
> I reverted 2062afb4f804 (I'm using 4.9.3 so I think it's safe)
>
> AFAICT, config DEBUG_INFO_DWARF4 isn't available in 3.14
> (I think bfaf2dd3509b was included in 3.16)
>
> But the problem seems to be on a higher level. My debugger
> just doesn't see ANY local variable whatsoever.
>
> For example, if I break in serial8250_probe, step past the
> initializations, then the Eclipse "Variables" tab states
> Locals: 0 variables (as it does everywhere, mind you).
>
> If I try to print from the "Commands" tab:
>
> print p
> ERROR(EXP8): Could not find the symbol "p"
> print irqflag
> ERROR(EXP8): Could not find the symbol "irqflag"
>
> I'm doing wrong something fundamental.
>
> This is my work flow:
>
> Start the system, interrupt it in Uboot
> Connect the DS-5 probe
> Set a HW breakpoint at the address of start_kernel
> Let Uboot load the kernel
> When the breakpoint is hit, load the symbols with:
> add-symbol-file /opt/linux-3.14/vmlinux
>
> => Is vmlinux supposed to contain the debug info for the
> local variables? (I mean 'automatic' variables, in the
> C sense.)
I went all-in, and set
KBUILD_CFLAGS += -g3
in the top-level Makefile.
Still no local variables shown.
http://eli.thegreenplace.net/2011/02/07/how-debuggers-work-part-3-debugging-information/
$ arm-linux-gnueabihf-objdump -x vmlinux | grep "\.debug"
25 .debug_line 0041075d 00000000 00000000 003679d3 2**0
26 .debug_info 01a54a2f 00000000 00000000 00778130 2**0
27 .debug_abbrev 000edef8 00000000 00000000 021ccb5f 2**0
28 .debug_aranges 00007508 00000000 00000000 022baa58 2**3
29 .debug_ranges 000ab8c8 00000000 00000000 022c1f60 2**3
30 .debug_frame 000a5864 00000000 00000000 0236d828 2**2
31 .debug_str 001aa5cd 00000000 00000000 0241308c 2**0
32 .debug_macro 0041d5d4 00000000 00000000 025bd659 2**0
33 .debug_loc 00427524 00000000 00000000 029dac2d 2**0
$ arm-linux-gnueabihf-objdump --dwarf=info vmlinux | wc
12972723 60571026 650075352
Seems there is a lot of information available, but the debugger
doesn't seem to be able to make use of it...
To take my serial8250_probe example:
static int serial8250_probe(struct platform_device *dev)
{
struct plat_serial8250_port *p = dev_get_platdata(&dev->dev);
struct uart_8250_port uart;
int ret, i, irqflag = 0;
<1><101ea81>: Abbrev Number: 76 (DW_TAG_subprogram)
<101ea82> DW_AT_name : (indirect string, offset: 0x152f7a): serial8250_probe
<101ea86> DW_AT_decl_file : 1
<101ea87> DW_AT_decl_line : 3089
<101ea89> DW_AT_prototyped : 1
<101ea89> DW_AT_type : <0x100ec7a>
<101ea8d> DW_AT_low_pc : 0xc018e0f4
<101ea91> DW_AT_high_pc : 0x228
<101ea95> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa)
<101ea97> DW_AT_GNU_all_tail_call_sites: 1
<101ea97> DW_AT_sibling : <0x101eb39>
<2><101ea9b>: Abbrev Number: 77 (DW_TAG_formal_parameter)
<101ea9c> DW_AT_name : dev
<101eaa0> DW_AT_decl_file : 1
<101eaa1> DW_AT_decl_line : 3089
<101eaa3> DW_AT_type : <0x10127be>
<101eaa7> DW_AT_location : 3 byte block: 91 e4 7d (DW_OP_fbreg: -284)
<2><101eaab>: Abbrev Number: 88 (DW_TAG_variable)
<101eaac> DW_AT_name : p
<101eaae> DW_AT_decl_file : 1
<101eaaf> DW_AT_decl_line : 3091
<101eab1> DW_AT_type : <0x101eb39>
<101eab5> DW_AT_location : 2 byte block: 91 6c (DW_OP_fbreg: -20)
<2><101eab8>: Abbrev Number: 89 (DW_TAG_variable)
<101eab9> DW_AT_name : (indirect string, offset: 0x150dd5): uart
<101eabd> DW_AT_decl_file : 1
<101eabe> DW_AT_decl_line : 3092
<101eac0> DW_AT_type : <0x101846a>
<101eac4> DW_AT_location : 3 byte block: 91 e8 7d (DW_OP_fbreg: -280)
<2><101eac8>: Abbrev Number: 88 (DW_TAG_variable)
<101eac9> DW_AT_name : ret
<101eacd> DW_AT_decl_file : 1
<101eace> DW_AT_decl_line : 3093
<101ead0> DW_AT_type : <0x100ec7a>
<101ead4> DW_AT_location : 2 byte block: 91 58 (DW_OP_fbreg: -40)
<2><101ead7>: Abbrev Number: 88 (DW_TAG_variable)
<101ead8> DW_AT_name : i
<101eada> DW_AT_decl_file : 1
<101eadb> DW_AT_decl_line : 3093
<101eadd> DW_AT_type : <0x100ec7a>
<101eae1> DW_AT_location : 2 byte block: 91 68 (DW_OP_fbreg: -24)
<2><101eae4>: Abbrev Number: 89 (DW_TAG_variable)
<101eae5> DW_AT_name : (indirect string, offset: 0x151780): irqflag
<101eae9> DW_AT_decl_file : 1
<101eaea> DW_AT_decl_line : 3093
<101eaec> DW_AT_type : <0x100ec7a>
<101eaf0> DW_AT_location : 2 byte block: 91 64 (DW_OP_fbreg: -28)
I'm running out of ideas. I'll give DWARF 4 a try.
My debugger is ARM DS-5 v5.13 (Build 1622)
Regards.
More information about the linux-arm-kernel
mailing list