Другой метод, указанный Василом Димовым в ответе на аналогичный вопрос, - заменить вызов функции макросом-оберткой, который сообщает или передает имя вызывающей функции.Это будет работать с встроенными функциями, где обратная трассировка не будет.С другой стороны, это не будет работать, если вы вызываете функцию по ссылке или иным образом берете ее адрес.
Например:
int B(int x){
...
}
может стать:
int _B(int x, char *caller){
printf("caller is %s\n", caller);
...
}
#define B(x) _B((x), __func__)
и каждый вызов B () выводит имя звонящего.Васил Димов строит его по-другому, печатая имя непосредственно в макросе и оставляя функцию неизменной.