void Demo() { //函数有返回值,却没有处理 RetFunc(); }
// Stop或return时调用 int CallHookOut(ProfState *S, GlobalState* pState) { if (S->level==0 || pState->HookMark==0) return 0; ProfData info; --S->level; // 调用栈计数减一 info = RetFunc(S, 0); PauseTotalTime(S); info.LocalTime += pState->FuncCallTime; info.TotalTime += pState->FuncCallTime; formats(info.FileDefined); formats(info.FunctionName); // string pool满时输出 if ( pState->BufCount < MAX_BUFFER_COUNT ) { if (info.TotalTime >= 0.000001) { pState->Buffer[pState->BufCount].level = S->level; pState->Buffer[pState->BufCount].FunctionName = info.FunctionName; //AllocateStringPool(pState, FuncNameLen); pState->Buffer[pState->BufCount].FileDefined = info.FileDefined; //AllocateStringPool(pState, FileNameLen); pState->Buffer[pState->BufCount].LineDefined = info.LineDefined; pState->Buffer[pState->BufCount].CurrentLine = info.CurrentLine; pState->Buffer[pState->BufCount].LocalTime = info.LocalTime; pState->Buffer[pState->BufCount].TotalTime = info.TotalTime; ++pState->BufCount; } else { free(info.FunctionName); } } else { FILE* FW = fopen(pState->auxs, "a"); int i = 0; for ( i=0; i<MAX_BUFFER_COUNT; ++i ) { output( FW, "%d\t%s\t%s\t%d\t%d\t%f\t%f\n", pState->Buffer[i].level, pState->Buffer[i].FileDefined, pState->Buffer[i].FunctionName, pState->Buffer[i].LineDefined, pState->Buffer[i].CurrentLine, pState->Buffer[i].LocalTime, pState->Buffer[i].TotalTime ); free(pState->Buffer[i].FunctionName); pState->Buffer[i].FunctionName = NULL; } // 输出当前调用函数 output( FW, "%d\t%s\t%s\t%d\t%d\t%f\t%f\n", S->level, info.FileDefined, info.FunctionName, info.LineDefined, info.CurrentLine, info.LocalTime, info.TotalTime); free(info.FunctionName); pState->BufCount = 0; fclose(FW); } // 输出信息完毕,唤醒计时 if (S->level != 0) ResumeAllTime(S); return 1; }