少年修仙传客户端基础资源
hch
2024-04-11 4c71d74b77c9eb62a0323698c9a0db3b641a917e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "il2cpp-config.h"
 
#if IL2CPP_TARGET_WINDOWS
 
#include "WindowsHeaders.h"
#include "dbghelp.h"
 
#include "os/Mutex.h"
#include "os/StackTrace.h"
 
namespace il2cpp
{
namespace os
{
    void StackTrace::WalkStackNative(WalkStackCallback callback, void* context, WalkOrder walkOrder)
    {
        const uint32_t kMaxFrames = 128;
        void* stack[kMaxFrames];
 
        size_t frames = CaptureStackBackTrace(0, kMaxFrames, stack, NULL);
 
        if (walkOrder == kFirstCalledToLastCalled)
        {
            for (size_t i = frames; i--;)
            {
                if (!callback(reinterpret_cast<Il2CppMethodPointer>(stack[i]), context))
                    break;
            }
        }
        else
        {
            for (size_t i = 0; i < frames; i++)
            {
                if (!callback(reinterpret_cast<Il2CppMethodPointer>(stack[i]), context))
                    break;
            }
        }
    }
 
    std::string StackTrace::NativeStackTrace()
    {
        std::string stackTrace;
 
#if !IL2CPP_TARGET_WINRT && !IL2CPP_TARGET_XBOXONE && !IL2CPP_TARGET_WINDOWS_GAMES
        HANDLE hProcess = GetCurrentProcess();
        BOOL result = SymInitialize(hProcess, NULL, TRUE);
        if (!result)
            return std::string();
 
        const uint32_t kMaxFrames = 128;
        void* stack[kMaxFrames];
 
        size_t frames = CaptureStackBackTrace(0, kMaxFrames, stack, NULL);
 
        for (size_t i = 0; i < frames; i++)
        {
            DWORD64  dwDisplacement = 0;
 
            char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
            PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;
 
            pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
            pSymbol->MaxNameLen = MAX_SYM_NAME;
 
            if (SymFromAddr(hProcess, (DWORD64)stack[i], &dwDisplacement, pSymbol))
            {
                stackTrace += "at ";
                stackTrace += pSymbol->Name;
                stackTrace += "\n  ";
            }
        }
#endif // !IL2CPP_TARGET_WINRT && !IL2CPP_TARGET_XBOXONE && !IL2CPP_TARGET_WINDOWS_GAMES
 
        return stackTrace;
    }
 
    const void* StackTrace::GetStackPointer()
    {
        // TODO implement to avoid extra WalkStack calls
        return nullptr;
    }
}
}
 
#endif