在一个已有的大型软件系统中,获取软件相关函数的运行顺序,可以利用gcc自动的-finstrument-functions功能。
参考代码如下:
#define TRACE_NUM_MAX 10000
__l2_thread__ UINT32 g_ulTraceNum=0;
__l2_thread__ VOID* g_pFuncRecord[TRACE_NUM_MAX];
__l2_thread__ UINT32 g_ulTraceState=0;
void COMM_TraceStart()
{
if(g_ulTraceState == 1)
{
g_ulTraceNum = 0;
g_ulTraceState = 2;
}
}
void COMM_TraceEnd()
{
if(g_ulTraceState == 2)
{
g_ulTraceState = 0;
}
}
void COMM_TracePrint(UINT32 ulStart, UINT32 ulEnd)
{
UINT32 i;
if(ulEnd > TRACE_NUM_MAX)
{
ulEnd = TRACE_NUM_MAX;
}
for(i=ulStart;i<ulEnd;i++)
{
L2OS_Printf("COMM_TracePrint : %x", g_pFuncRecord[i]);
}
}
void __attribute__((__no_instrument_function__))
__cyg_profile_func_enter(void *this_func, void *call_site)
{
if(g_ulTraceState == 2 && g_ulTraceNum < TRACE_NUM_MAX)
{
g_pFuncRecord[g_ulTraceNum] = this_func;
g_ulTraceNum++;
}
}
void __attribute__((__no_instrument_function__))
__cyg_profile_func_exit(void *this_func, void *call_site)
{
}