libunwind-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: unw_step loops forever on MIPS.


From: Story, Lenny
Subject: Re: unw_step loops forever on MIPS.
Date: Thu, 10 Jun 2021 14:02:07 +0000

Sergey,

That patch worked great.

Thanks For the super quick response.
-Lenny

From: Sergey Korolev <s.korolev@ndmsystems.com>
Sent: Tuesday, June 8, 2021 4:58 PM
To: Story, Lenny <lstory@irobot.com>
Cc: libunwind-devel@nongnu.org <libunwind-devel@nongnu.org>
Subject: Re: unw_step loops forever on MIPS.
 
Lenny, please try an attached patch (https://github.com/keenetic/libunwind/commit/d746635d2b8d44b3dddbc333cfcd32f9fe8b213d).

From d746635d2b8d44b3dddbc333cfcd32f9fe8b213d Mon Sep 17 00:00:00 2001
From: Sergey Korolev <s.korolev@ndmsystems.com>
Date: Tue, 22 Jan 2019 23:56:38 +0300
Subject: [PATCH] mips: fix regression after "Handle Gstep according the N64/N32 ABI"

unw_step should return zero for _MIPS_SIM != _ABI64 when dwarf_step failed
(restore unw_step behaviour before 5eec9a2ecb9a93996d566bbfbcdbe006f64b7e16).
---
 src/mips/Gstep.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/mips/Gstep.c b/src/mips/Gstep.c
index f5a742e1..b967dd89 100644
--- a/src/mips/Gstep.c
+++ b/src/mips/Gstep.c
@@ -208,11 +208,14 @@ unw_step (unw_cursor_t *cursor)
   if (unlikely (ret == -UNW_ESTOPUNWIND))
     return ret;
 
-#if _MIPS_SIM == _ABI64
   if (unlikely (ret < 0))
     {
+#if _MIPS_SIM == _ABI64
       return _step_n64(c);
-    }
+#else
+      return ret;
 #endif
+    }
+
   return (c->dwarf.ip == 0) ? 0 : 1;
 }
--
2.25.1

On Tue, Jun 8, 2021 at 11:39 PM Story, Lenny <lstory@irobot.com> wrote:
Greetings,

I have a test of libunwind running on my mips target.  It seems the the unw_step api always returns > 0. This results in my backtrace loop never terminating.  

Any thoughts on why this would happen ?

Thanks !
-Lenny

I am using 1.5.0.

 [BACKTRACE] (1) main:140
 [BACKTRACE] (1) _init:736
 [BACKTRACE] (1) _init:736
 [BACKTRACE] (1) _init:736
 [BACKTRACE] (1) _init:736
 [BACKTRACE] (1) _init:736
 [BACKTRACE] (1) _init:736
 [BACKTRACE] (1) _init:736
 [BACKTRACE] (1) _init:736
 [BACKTRACE] (1) _init:736
 [BACKTRACE] (1) _init:736
 [BACKTRACE] (1) _init:736


void show_backtrace(void)
{
    char symbol[256];
    unw_cursor_t  cursor;
    unw_context_t context;
   
    unw_getcontext(&context);    
    unw_init_local(&cursor, &context);
   
    int Cursor_Result = 0;

    int n = 0;
   
    while((Cursor_Result = unw_step(&cursor)) > 0)
    {
        unw_word_t ip;
        unw_word_t sp;
        unw_word_t off;
   
        unw_get_reg(&cursor, UNW_REG_IP, &ip);
        unw_get_reg(&cursor, UNW_REG_SP, &sp);              
       
        memset(&symbol, 0, sizeof(symbol));
       
        if (unw_get_proc_name(&cursor, &symbol[0], sizeof(symbol), &off) == 0)
        {
            fprintf(stdout, "[BACKTRACE] (%d) %s:%d \n", Cursor_Result, &symbol[0], off);            
        }        

        if(n++ > 10)
            break;
    }
}


This e-mail message and any files attached may contain information that iRobot Corporation considers confidential and/or proprietary or may later designate as confidential and proprietary. If you are not the intended recipient, please contact the sender and delete the email immediately. Unauthorized use or distribution is strictly prohibited.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]