Просто добавив к превосходному ответу VonC, команды могли бы быть небольшим излишеством, если Ваше приложение является относительно небольшим. Их относительно более трудно установить, и они сияют больше всего, когда у Вас есть разнообразные перспективы, редакторы и представления.
Для чего-то простого, я пошел бы с действиями.
Вы можете использовать walkcontext ()
для просмотра стека, используя dladdr ()
/ dladdr1 ()
для преобразования адресов в имена функций. walkcontext ()
принимает ucontext для потока. Если у вас нет сотрудничества с этим потоком, вы можете получить для него ucontext, остановив поток (например, с помощью PCTWSTOP
), а затем прочитав его адрес из поля pr_oldcontext
структура lwpstatus для этого потока, полученная из / proc / self / lstatus
.
Если вы используете gcc, вы можете использовать встроенную функцию __builtin_return_address. void * __builtin_return_address (unsigned int level)
Функция возвращает адрес функции, из которой функция вызывается. то есть вызывающий объект функции.
Уровень определяет, сколько уровней. 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();
}