_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();
  
  //...
}

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

Причина обращения: