-std::wstring get_call_stack()
-{
- class log_call_stack_walker : public stack_walker
- {
- std::string str_;
- public:
- log_call_stack_walker() : stack_walker() {}
-
- std::string flush()
- {
- return std::move(str_);
- }
- protected:
- virtual void OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName)
- {
- }
- virtual void OnLoadModule(LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size, DWORD result, LPCSTR symType, LPCSTR pdbName, ULONGLONG fileVersion)
- {
- }
- virtual void OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr)
- {
- }
- virtual void OnOutput(LPCSTR szText)
- {
- std::string str = szText;
-
- if(str.find("internal::get_call_stack") == std::string::npos && str.find("stack_walker::ShowCallstack") == std::string::npos)
- str_ += std::move(str);
- }
- };
-
- static tbb::enumerable_thread_specific<log_call_stack_walker> walkers;
- try
- {
- auto& walker = walkers.local();
- walker.ShowCallstack();
- return u16(walker.flush());
- }
- catch(...)
- {
- return L"!!!";
- }
-}
-