|
@@ -154,12 +154,25 @@ int ctkBackTracePrivate::trace(void** array, size_t n) const
|
|
|
|
|
|
#elif defined(Q_CC_MSVC)
|
|
|
|
|
|
+USHORT (WINAPI *s_pfnCaptureStackBackTrace)(ULONG, ULONG, PVOID*, PULONG) = 0;
|
|
|
+
|
|
|
// --------------------------------------------------------------------------
|
|
|
int ctkBackTracePrivate::trace(void** array, size_t n) const
|
|
|
{
|
|
|
if(n>=63)
|
|
|
n=62;
|
|
|
- return RtlCaptureStackBackTrace(0, n, array, 0);
|
|
|
+
|
|
|
+ if (s_pfnCaptureStackBackTrace == 0)
|
|
|
+ {
|
|
|
+ const HMODULE hNtDll = ::GetModuleHandleW(L"ntdll.dll");
|
|
|
+ reinterpret_cast<void*&>(s_pfnCaptureStackBackTrace) =
|
|
|
+ ::GetProcAddress(hNtDll, "RtlCaptureStackBackTrace");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (s_pfnCaptureStackBackTrace != 0) {
|
|
|
+ return s_pfnCaptureStackBackTrace(0, n, array, 0);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
#else
|