From: Carl M. <mi...@ph...> - 2012-12-06 18:59:35
|
Hi, I've been looking into this a little further, and it appears to me that the problem is in gcc providing the wrong debug info. readelf -w shows: in .debug_info: <2><45>: Abbrev Number: 4 (DW_TAG_variable) <46> DW_AT_name : a <48> DW_AT_decl_file : 1 <49> DW_AT_decl_line : 4 <4a> DW_AT_type : <0x8e> <4e> DW_AT_location : 2 byte block: 91 78 (DW_OP_fbreg: -8) and then in .debug_loc: Offset Begin End Expression 00000000 f83e f840 (DW_OP_breg1 (r1): 0) 00000000 f840 f842 (DW_OP_breg4 (r4): 0) 00000000 f842 f8bc (DW_OP_breg4 (r4): -2) 00000000 <End of list> The 2 byte offset I'm seeing appears to be coming from the last line in .debug_loc. (If I change that -2 to 0 with a hex editor then the debugger finds the variables in the right place). I'm a total newbie to dwarf and gdb internals, but also see that changing the DW_OP_fbreg that describes the variable location to DW_OP_breg4 allows gdb to see the correct value. I see this with all the currently distributed msp430-gcc installs I've found: those currently distributed in Gentoo, Ubuntu 12.10, as well as MacPorts. In an older Ubuntu with gcc version 4.5.3 (GNU GCC patched mspgcc-20110716) the details are different, but the symptoms are similar. With that compilier, readelf shows that variable location as DW_OP_fbreg: -10 (when it should be -8), and .debug_loc shows: Offset Begin End Expression 00000000 fc38 fc3a (DW_OP_breg1 (r1): 2) 00000000 fc3a fc3c (DW_OP_breg4 (r4): 2) 00000000 fc3c fcb4 (DW_OP_breg4 (r4): 0) 00000000 <End of list> The net result here is the same that the debugger is looking two bytes off of where it should be. Seems like if I could keep the .debug_loc from the old compiler and the .debug_info from the new compiler it would all work... Any help in getting to the bottom of this would be appreciated. Carl On Wed, 5 Dec 2012, Carl Michal wrote: > Hello, > > I've noticed that when debugging programs with gdb on an MSP430 Launchpad > (MSP430G2231), the print command in gdb doesn't work properly for local > variables. The issue I'm seeing has very similar symptoms to: > http://sourceforge.net/tracker/?func=detail&aid=3417263&group_id=42303&atid=432701 > but the mspgcc I'm using appears to be much newer than that. > > If I ask gdb: >> info address a > it tells me: > Symbol "a" is a variable at frame base reg $r4 offset -2+-8. > > but looking at the assembly code produced with msp-gcc -S, a is always > referenced at -8(r4). The value I get with > (gdb) print a > corresponds to the variable at -10(r4). Doing > (gdb) x/1hd $r4-8 > > shows the correct value for a. > > I'm using > gcc version 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) (Gentoo > 4.6.3_p20120406 p1.0) > and > GNU gdb (Gentoo MSP430 7.2_p20111205) 7.2 > on Gentoo. > > Carl > > |