This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Minor fix in AVR prologue scan.


I use GDB from Eclipse with Avarice to debug AVR microcontrollers.
While single stepping (stepi) through the instructions of a normal
function prologue, stepping over the sbiw r28, 0x0f instruction, which
is near the end of the prologue, causes the following change in the
backtrace output:

Before stepi:
 #0 0x000042b0 in HID_Device_USBTask (HIDInterfaceInfo=0x80b8b8) at
 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.c:157
 #1 0x000002e0 in main () at HIDRadio.c:83

After stepi:
 #0 0x000042b2 in HID_Device_USBTask (HIDInterfaceInfo=0x8000ff) at
 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.c:157
 #1 0x00017170 in ?? ()

Note that the frame #1 is inconsistent.

If you now return from frame #0 with the finish command, the target does
not stop at the return address at main. Instead, the target starts
running and it's necessary to manually stop it.

This is not a big issue and I'm not an expert of the gdb internals but
the fix seems easy enough.

gdb/ChangeLog:
2016-03-17  Cristiano De Alti  <cristiano_dealti@hotmail.com>
	* avr-tdep.c (avr_scan_prologue): fix comparison to detect
	the prologue limits.
---
 gdb/avr-tdep.c |   11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
index 993e92b..a8080db 100644
--- a/gdb/avr-tdep.c
+++ b/gdb/avr-tdep.c
@@ -833,25 +833,26 @@ avr_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end,
          or signal handler functions, which is why we set the prologue type
          when we saw the beginning of the prologue previously.  */
 
-      if (vpc + sizeof (img_sig) < len
+      if (vpc + sizeof (img_sig) <= len
 	  && memcmp (prologue + vpc, img_sig, sizeof (img_sig)) == 0)
         {
+          info->size += locals_size;
           vpc += sizeof (img_sig);
         }
-      else if (vpc + sizeof (img_int) < len 
+      else if (vpc + sizeof (img_int) <= len 
 	       && memcmp (prologue + vpc, img_int, sizeof (img_int)) == 0)
         {
+          info->size += locals_size;
           vpc += sizeof (img_int);
         }
-      if (vpc + sizeof (img) < len
+      if (vpc + sizeof (img) <= len
 	  && memcmp (prologue + vpc, img, sizeof (img)) == 0)
         {
+          info->size += locals_size;
           info->prologue_type = AVR_PROLOGUE_NORMAL;
           vpc += sizeof (img);
         }
 
-      info->size += locals_size;
-
       /* Fall through.  */
     }
 
-- 
1.7.10.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]