Получите стек вызовов от любого потока в C

Просто добавив к превосходному ответу VonC, команды могли бы быть небольшим излишеством, если Ваше приложение является относительно небольшим. Их относительно более трудно установить, и они сияют больше всего, когда у Вас есть разнообразные перспективы, редакторы и представления.

Для чего-то простого, я пошел бы с действиями.

6
задан NickB 21 August 2009 в 08:18
поделиться

2 ответа

Вы можете использовать walkcontext () для просмотра стека, используя dladdr () / dladdr1 () для преобразования адресов в имена функций. walkcontext () принимает ucontext для потока. Если у вас нет сотрудничества с этим потоком, вы можете получить для него ucontext, остановив поток (например, с помощью PCTWSTOP ), а затем прочитав его адрес из поля pr_oldcontext структура lwpstatus для этого потока, полученная из / proc / self / lstatus .

4
ответ дан 17 December 2019 в 00:12
поделиться

Если вы используете 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();
}
3
ответ дан 17 December 2019 в 00:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: