Если вы используете gcc, вы можете использовать встроенную функцию __builtin_return_address.
void * __builtin_return_address (неподписанный int уровень)
Функция возвращает адрес функции, из которой вызывается функция. то есть вызывающая функция.
Уровень указывает, сколько уровней. 0 означает текущую функцию 1 означает вызывающего абонента, 2 означает вызывающего абонента.
Следующий пример предоставит использование. Распечатывая адреса функции, можно определить стек вызовов.
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();
}