_FUNCSTACKSIG__ ???

Всем здравствуйте! 

Подскажите, пожалуйста, каким образом можно вывести программно стек вызовов? __FUNCSIG__ дает некоторое представление где находится код, но этого мало )

Нету такой возможности. Есть только возможность попросить разработчиков чтобы была такая возможность).
Конечно, можно сделать своё с возможностью выключения через макросы, но это уже другое и слишком "костыльно".
Aliaksandr Hryshyn:
Нету такой возможности. Есть только возможность попросить разработчиков чтобы была такая возможность).
Конечно, можно сделать своё с возможностью выключения через макросы, но это уже другое и слишком "костыльно".

а в чем состоит эта костыльная идея?

Nikolai Karetnikov:

а в чем состоит эта костыльная идея?

на входе в функцию запихивать в отдельный стек её сигнатуру, при выходе вытаскивать.

вуалля - стек вызовов под рукой для отладки и всяких заковырестых вещей

костыльность идеи в лишних движениях, отъеденной производительностью и очень легко сделать фатальную ошибку (достаточно один раз не вытащить сигнатуру из стека)

и вообще это задача отладчика/профилера :-)

Верно сказано)
Maxim Kuznetsov:

на входе в функцию запихивать в отдельный стек её сигнатуру, при выходе вытаскивать.

вуалля - стек вызовов под рукой для отладки и всяких заковырестых вещей

костыльность идеи в лишних движениях, отъеденной производительностью и очень легко сделать фатальную ошибку (достаточно один раз не вытащить сигнатуру из стека)

и вообще это задача отладчика/профилера :-)

Спасибо!

Похоже игра не стоит свеч, ведь вход у функции один, а выходы  разбросаны по всему телу ;)

У старшего брата (С++) это штука хоть есть?

Maxim Kuznetsov:

очень легко сделать фатальную ошибку (достаточно один раз не вытащить сигнатуру из стека)

Это должно быть обёрнуто в RAII, так что проблемы нет.
Alexey Navoykov:
Это должно быть обёрнуто в RAII, так что проблемы нет.

"Должно быть" это фантастика

Закон Мёрфи, в личной интерпретации:

если могут быть грабли, значит они есть. Если они есть то на них наступают все.

Alexey Navoykov:
Это должно быть обёрнуто в RAII, так что проблемы нет.

как обернуть? return() из метода не переопределишь, придется рядом с каждым выходом прописывать исключение из стека

Nikolai Karetnikov:

как обернуть? return() из метода не переопределишь, придется рядом с каждым выходом прописывать исключение из стека

Ну вот в упрощённом виде:

string __stack_trace[1000];
int    __stack_trace_i = 0;

string GetStackTraceString() { 
  string str;
  for (int i=0; i<__stack_trace_i; i++)
    str += (i>0 ? "\n" : "") + __stack_trace[i];
  return str;
}

struct TFuncTrace
{ 
  TFuncTrace(string name) { __stack_trace[__stack_trace_i++]= name; }
  ~TFuncTrace()           { __stack_trace_i--; };
};

#define TRACE(dummy)  TFuncTrace funcTrace(__FUNCSIG__);


void MyFunc()
{
  TRACE();
  
  //...
}

Дальше уже сам добавляешь по вкусу.