[Print call stack at runtime]
For Linux:
http://man7.org/linux/man-pages/man3/backtrace.3.html
           #define SIZE 100
          int j, nptrs;
           void *buffer[100];
           char **strings;
           nptrs = backtrace(buffer, SIZE);
           strings = backtrace_symbols(buffer, nptrs);
           if (strings == NULL) {
  
               perror("backtrace_symbols");
  
               exit(EXIT_FAILURE);
           }
           for (j = 0; j < nptrs; j++)
  
               printf("%s\n", strings[j]);
           free(strings);
For WinCE:http://msdn.microsoft.com/en-us/library/ms885641.aspx
    static const int kMaxFrames = 15; 
    CallSnapshot lpFrames[kMaxFrames]; 
    DWORD dwCnt = GetThreadCallStack(GetCurrentThread(), kMaxFrames, lpFrames, 0, 0); 
    for(int i = 0; i < dwCnt; i++) { 
  
        NKDbgPrintfW(TEXT("[%02d] Return Address: 0x%08X\n"), i + 1, lpFrames[i].dwReturnAddr); 
    } [Log function's enter/exit]
class FunctionLogger
{
    public:
        FunctionLogger(char* name, void* pointer);
        ~FunctionLogger();
    private:
        char* functionName;
        void* pointerAddr;
};
FunctionLogger::FunctionLogger(char* name, void* pointer)
:functionName(name),pointerAddr(pointer)
{
        printf("Function Enter %s this=%d\n", functionName, pointerAddr);
}
FunctionLogger::~FunctionLogger()
{
    printf("Function Leave %s this=%d\n", functionName, pointerAddr);
}
#define LogEnterAndLeave(pointer) FunctionLogger funcLogger(__FUNCTION__, pointer)
void fired()
{
        LogEnterAndLeave(this);
    ...........
}
[How to print virtual function pointer address before runnuing it]
class TimerBase {
...
private:
    virtual void fired() = 0;
..
}
typedef void (*functionPtr)();
void ThreadTimers::sharedTimerFiredInternal()
{
...
        int *vptr = *(int**)&timer;
        int *vtable = (int *)*vptr; 
        functionPtr fp = (functionPtr)vtable[1]; // offset 1 is the “fired()” function offset in Timer class virtual function table
        printf("ThreadTimers::sharedTimerFiredInternal call fired function:%p\n",fp);
        timer->fired();
        printf("ThreadTimers::sharedTimerFiredInternal fired function finish\n");
...
}
0 意見:
張貼留言