쉽지 않습니다. 정확한 해결책은 OS와 실행 환경에 따라 크게 달라집니다.
스택을 인쇄하는 것은 일반적으로 어렵지는 않지만 디버그 기호를 읽는 것을 의미하기 때문에 기호를 찾는 일은 매우 까다 롭습니다.
#ifdef DEBUG
struct StackEntry
{
const char *file;
const char *func;
int line;
StackEntry(const char *f, const char *fn, int ln) : file(f), func(fn), line(ln) {}
};
std::stack<StackEntry> call_stack;
class FuncEntry
{
public:
FuncEntry(const char *file, const char *func, int line)
{
StackEntry se(file, func, line);
call_stack.push_back(se);
}
~FuncEntry()
{
call_stack.pop_back();
}
void DumpStack()
{
for(sp : call_stack)
{
cout << sp->file << ":" << sp->line << ": " << sp->func << "\n";
}
}
};
#define FUNC() FuncEntry(__FILE__, __func__, __LINE__);
#else
#define FUNC()
#endif
void somefunction()
{
FUNC();
... more code here.
}
내가 과거에이 기술을 사용하고 있습니다 :
대안은 일부는 "여기서 나는"(아마도 "디버그 빌드 만"에 대한) 각 기능에 대한 형 코드가 침입 방법을 사용하고 추가하는 것입니다 ,하지만이 코드를 입력했는데 컴파일되지 않을 수도 있지만 충분히 명확하다고 생각합니다. 중요한 이점 중 하나는 "중요한 것"과 같은 모든 기능에이 기능을 넣지 않아도된다는 것입니다. [다른 디버깅 수준에 따라 서로 다른 유형의 FUNC
매크로를 활성화하거나 비활성화 할 수 있습니다.]
어떤 것이 있으면 [''] (http://man7.org/linux/man-pages/man3/backtrace.3.html)을보십시오. –
H2CO3에서 제안한 것과 같은 것을 사용하는 것 외에도 대부분 플랫폼에 따라 다르며 경우에 따라서는 불가능할 수도 있습니다. –
디버깅 정보 및 최적화 정도에 크게 의존합니다. 많은 최적화는 인라인 및 꼬리 호출 최적화와 같이 일부 스택 프레임을 모두 존재하지 않게하는 경향이 있습니다. – SirDarius