Вы ищете трассировку стека, и нет портативного способа ее получить.Нечто похожее может быть достигнуто с помощью:
struct SourcePoint
{
const char *filename;
int line;
SourcePoint(const char *filename, int line)
: filename(filename), line(line)
{ }
};
std::vector<SourcePoint> callstack;
struct SourcePointMarker
{
SourcePointMarker(const char *filename, int line)
{
callstack.push_back(SourcePoint(filename, line);
}
~SourcePointMarker()
{
callstack.pop_back();
}
}
#define MARK_FUNCTION \
SourcePointMarker sourcepointmarker(__FILE__, __LINE__);
Затем сразу после начала каждой функции (или точки интереса) вы просто добавляете строку ... например
int myFunction(int x)
{
MARK_FUNCTION
...
}
Используя этот подход в ваших обработчиках ошибок, вы можете узнать, кто был вызван кем и так далее (конечно, вы будете знать только те функции или места, которые были оснащены MARK_FUNCTION).Если это необходимо только во время тестирования (а не в производственном процессе), то, вероятно, вам следует просто включить дампы ядра и научиться запускать отладчик в посмертном анализе.