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
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;
}