# Error management : backtrace problem

**URL:** <https://forum.sierrawireless.com/t/error-management-backtrace-problem/473>\
**Category:** Open AT\
**Created:** [May 24, 2006, 10:08am UTC](https://forum.sierrawireless.com/t/error-management-backtrace-problem/473 "2006-05-24T10:08:27Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![gdt](https://avatars.discourse-cdn.com/v4/letter/g/7993a0/32.png) [@gdt](https://forum.sierrawireless.com/u/gdt)\
**Post date:** [May 24, 2006, 10:08am UTC](https://forum.sierrawireless.com/t/error-management-backtrace-problem/473/1 "2006-05-24T10:08:27Z")

</div>

Hi everybody,

I tried to get backtrace after an exception (ADL\_INIT\_REBOOT\_FROM\_EXCEPTION event in adl\_main). I want to display the backtrace in the terminal emulator.  
I used bug\_GetBkTrcBuffer to get the backtrace buffer. The problem is that adl\_errRetrieveNextBacktrace returns always -11 ADL\_RET\_ERR\_DONE… I don’t analyze theses backtraces before. When a cause an exception, there isn’t new backtrace available…

I’m using an Q2686H with OpenAT 4.

Does someone have an idea ?

Thanks

```auto
u8 * bug_GetBkTrcBuffer ( u8 BktrId, u16 * Size, u8 * Count )
{
    u8 * TotalBuffer = NULL;
    
    // Initialize backtraces analysis
    s8 AnalysisHandle = adl_errStartBacktraceAnalysis();
    
    TRACE (( 2, "[bug_GetBkTrcBuffer] start analysis : %d", AnalysisHandle ));
    
    // Initialize variables
    *Count = 0;
    *Size = 0;

    // Check handle
    if ( AnalysisHandle >= OK )
    {
        s32 sReturn = OK;
        s32 NextBufferSize;
        
        // Start loop to retrieve all backtraces
        while ( sReturn == OK )
        {
            // Get size
            sReturn = NextBufferSize = adl_errRetrieveNextBacktrace ( AnalysisHandle, NULL, 0 );
            TRACE (( 2, "[bug_GetBkTrcBuffer] required size : %d", NextBufferSize ));
            
            // Check if there is something to get
            if ( NextBufferSize > 0 )
            {
                u8 * NewBuffer;
                
                // Check for mode
                if ( !BktrId )
                {
                    // "Cumulative" mode
                    // Reallocate memory
                    NewBuffer = adl_memGet ( NextBufferSize + *Size );
                    
                    // Copy old buffer (if any)
                    if ( *Size && TotalBuffer )
                    {
                        wm_memcpy ( NewBuffer, TotalBuffer, *Size );
                        
                        // Release old buffer
                        adl_memRelease ( TotalBuffer );
                    }
                    
                    // Update total buffer
                    TotalBuffer = NewBuffer;
                }
                else
                {
                    // Get memory just for the current one
                    TotalBuffer = adl_memGet ( NextBufferSize );
                }
                
                // Get backtrace
                sReturn = adl_errRetrieveNextBacktrace ( AnalysisHandle, TotalBuffer + *Size, NextBufferSize );
                TRACE (( 2, "[bug_GetBkTrcBuffer] retrieve backtrace result : %d", sReturn ));
                
                // Check for mode
                if ( !BktrId )
                {
                    // Update total size
                    *Size += NextBufferSize;
                }
                else
                {
                    // Check if it is the required one
                    if ( ( BktrId - 1 ) == *Count )
                    {
                        // Yes : update size and exit
                        *Size = NextBufferSize;
                        *Count = 1;
                        break;
                    }
                    else
                    {
                        // Not the required one : release memory
                        adl_memRelease ( TotalBuffer );
                    }
                }
                
                // Increase backtrace count if retrieve OK
                if ( sReturn == OK )
                {
                    *Count += 1;
                }
            }
        }
    }
    
    TRACE (( 2, "[bug_GetBkTrcBuffer] count : %d ; size : %d", *Count, *Size ));
    
    return TotalBuffer;
}
```

---

<div class="post-metadata">

**Author:** ![nebuchanazer](https://avatars.discourse-cdn.com/v4/letter/n/43a26b/32.png) [@nebuchanazer](https://forum.sierrawireless.com/u/nebuchanazer)\
**Post date:** [June 2, 2006, 11:13am UTC](https://forum.sierrawireless.com/t/error-management-backtrace-problem/473/2 "2006-06-02T11:13:53Z")

</div>

I supose this code keep traces in the modem. But, how you retrieve it to view traces in a pc which the modem is conected??

---

<div class="post-metadata">

**Author:** ![gdt](https://avatars.discourse-cdn.com/v4/letter/g/7993a0/32.png) [@gdt](https://forum.sierrawireless.com/u/gdt)\
**Post date:** [June 2, 2006, 12:38pm UTC](https://forum.sierrawireless.com/t/error-management-backtrace-problem/473/3 "2006-06-02T12:38:41Z")

</div>

Hi nebuchanazer,

You can use de TRACE function who display the trace in the target monitoring tool.

The bug sample didn’t work in debug mode. You must compile it in wismo target mode, upload the dwl and run the sample. Works perfectly after 😉

Regards,

gdt
