If you use gcc, you can use the __builtin_return_address built-in function. void * __builtin_return_address (unsigned int level)
The function returns the address of the function from which the function is called. that is, the calling function.
Level determines the number of levels. 0 means the current function 1 means the caller, 2 means the caller. The following example will provide use. By selecting function addresses, you can define a call stack.
int calla() { printf("Inside calla\n"); printf("A1=%x\n",__builtin_return_address (0)); printf("A2=%x\n",__builtin_return_address (1) ); printf("A3=%x\n",__builtin_return_address (2) ); } int callb() { printf("Inside callb\n"); calle(); printf("B1=%x\n",__builtin_return_address (0) ); printf("B2=%x\n",__builtin_return_address (1) ); printf("B3=%x\n",__builtin_return_address (2) ); } int callc() { printf("Inside callc\n"); printf("C1=%x\n",__builtin_return_address (0) ); printf("C2=%x\n",__builtin_return_address (1) ); printf("C3=%x\n",__builtin_return_address (2) ); } int calld() { printf("Inside calld\n"); printf("D1=%x\n",__builtin_return_address (0) ); printf("D2=%x\n",__builtin_return_address (1) ); printf("D3=%x\n",__builtin_return_address (2) ); } int calle() { printf("Inside calle\n"); printf("E1=%x\n",__builtin_return_address (0) ); printf("E2=%x\n",__builtin_return_address (1) ); printf("E3=%x\n",__builtin_return_address (2) ); } main() { printf("Address of main=%x calla=%x callb=%x callc=%x calld=%x calle=%x\n",main,calla,callb,callc,calld,calle); calla(); callb(); calld(); }
Saradhi
source share