POE 2 Complete PC Freeze while loading screen

Just uninstall the game at this point and move on with your life, it will not change any time soon or for the better. This trend has persisted for a while by GGG.

Call them out on every single social media platform, don't let them get away with this.

Like so may others I paid to play this game and I can not even do that.

There will be a fix in a few years... maybe... sigh



Someone should start a class action lawsuit to refund the early access purchase price.

They delivered not even half of what they promised in EA and the game is actually unplayable.
Последняя редакция: Braric#4417. Время: 18 февр. 2025 г., 18:28:06
After some hours I've managed to trigger another crash again. And I kinda saw something. I can't say that I have some good info but who knows, maybe it helps. Also, my debugger bugged and it prints the same thing twice ( sorry about that ) but I didn't have that much time to make the output look nice and I didn't want to try to restart the debugger and try to generate another crash.

So I was printing the stack trace from all threads when the exception occurs:
"

# 15 Id: 298c.502c Suspend: 1 Teb: 000000be`6be5a000 Unfrozen
# Child-SP RetAddr Call Site
00 00 000000be`73ff7d50 00007ff6`42e90d27 KERNELBASE!RaiseException+0x8a
000000be`73ff7d50 00007ff6`42e90d27 KERNELBASE!RaiseException+0x8a
01 01 000000be`73ff7e50 00007ff6`42e87300 PathOfExileSteam+0x2360d27
000000be`73ff7e50 00007ff6`42e87300 PathOfExileSteam+0x2360d27
02 02 000000be`73ff7ec0 00007ff6`42f520c8 PathOfExileSteam+0x2357300
000000be`73ff7ec0 00007ff6`42f520c8 PathOfExileSteam+0x2357300
03 03 000000be`73ff7ef0 00007ff6`42e87260 PathOfExileSteam+0x24220c8
000000be`73ff7ef0 00007ff6`42e87260 PathOfExileSteam+0x24220c8
04 04 000000be`73ff7f20 00007ff6`42e7e17e PathOfExileSteam+0x2357260
000000be`73ff7f20 00007ff6`42e7e17e PathOfExileSteam+0x2357260
05 05 000000be`73ff7f50 00007ff9`263a3886 PathOfExileSteam+0x234e17e
000000be`73ff7f50 00007ff9`263a3886 PathOfExileSteam+0x234e17e
06 06 000000be`73ff8020 00007ff6`417860b9 ntdll!RcConsolidateFrames+0x6
000000be`73ff8020 00007ff6`417860b9 ntdll!RcConsolidateFrames+0x6
07 07 000000be`73fff9e0 00007ff9`24ace8d7 PathOfExileSteam+0xc560b9
000000be`73fff9e0 00007ff9`24ace8d7 PathOfExileSteam+0xc560b9
08 08 000000be`73fffa40 00007ff9`2633bf2c KERNEL32!BaseThreadInitThunk+0x17
000000be`73fffa40 00007ff9`2633bf2c KERNEL32!BaseThreadInitThunk+0x17
09 09 000000be`73fffa70 00000000`00000000 ntdll!RtlUserThreadStart+0x2c

16 Id: 298c.1910 Suspend: 1 Teb: 000000be`6be5c000 Unfrozen
# Child-SP RetAddr Call Site
000000be`73fffa70 00000000`00000000 ntdll!RtlUserThreadStart+0x2c

16 Id: 298c.1910 Suspend: 1 Teb: 000000be`6be5c000 Unfrozen
# Child-SP RetAddr Call Site
00 00 000000be`747ff908 00007ff9`262f3524 ntdll!NtWaitForAlertByThreadId+0x14
000000be`747ff908 00007ff9`262f3524 ntdll!NtWaitForAlertByThreadId+0x14
01 01 000000be`747ff910 00007ff9`23afde78 ntdll!RtlSleepConditionVariableSRW+0x1c4
000000be`747ff910 00007ff9`23afde78 ntdll!RtlSleepConditionVariableSRW+0x1c4
02 02 000000be`747ff9b0 00007ff6`42e06a19 KERNELBASE!SleepConditionVariableSRW+0x38
000000be`747ff9b0 00007ff6`42e06a19 KERNELBASE!SleepConditionVariableSRW+0x38
03 03 000000be`747ff9f0 00007ff6`41785d7b PathOfExileSteam+0x22d6a19
000000be`747ff9f0 00007ff6`41785d7b PathOfExileSteam+0x22d6a19
04 04 000000be`747ffa20 00007ff6`417838d1 PathOfExileSteam+0xc55d7b
000000be`747ffa20 00007ff6`417838d1 PathOfExileSteam+0xc55d7b
05 05 000000be`747ffa50 00007ff6`40cfb636 PathOfExileSteam+0xc538d1
000000be`747ffa50 00007ff6`40cfb636 PathOfExileSteam+0xc538d1
06 06 000000be`747ffaa0 00007ff6`40cfaf71 PathOfExileSteam+0x1cb636
000000be`747ffaa0 00007ff6`40cfaf71 PathOfExileSteam+0x1cb636
07 07 000000be`747ffad0 00007ff6`417860b9 PathOfExileSteam+0x1caf71
000000be`747ffad0 00007ff6`417860b9 PathOfExileSteam+0x1caf71
08 08 000000be`747ffb00 00007ff9`24ace8d7 PathOfExileSteam+0xc560b9
000000be`747ffb00 00007ff9`24ace8d7 PathOfExileSteam+0xc560b9
09 09 000000be`747ffb60 00007ff9`2633bf2c KERNEL32!BaseThreadInitThunk+0x17
000000be`747ffb60 00007ff9`2633bf2c KERNEL32!BaseThreadInitThunk+0x17
0a 0a 000000be`747ffb90 00000000`00000000 ntdll!RtlUserThreadStart+0x2c

17 Id: 298c.4ab4 Suspend: 1 Teb: 000000be`6be5e000 Unfrozen
# Child-SP RetAddr Call Site
000000be`747ffb90 00000000`00000000 ntdll!RtlUserThreadStart+0x2c

17 Id: 298c.4ab4 Suspend: 1 Teb: 000000be`6be5e000 Unfrozen
# Child-SP RetAddr Call Site
00 00 000000be`74fff558 00007ff9`262f3524 ntdll!NtWaitForAlertByThreadId+0x14
000000be`74fff558 00007ff9`262f3524 ntdll!NtWaitForAlertByThreadId+0x14
01 01 000000be`74fff560 00007ff9`23afde78 ntdll!RtlSleepConditionVariableSRW+0x1c4
000000be`74fff560 00007ff9`23afde78 ntdll!RtlSleepConditionVariableSRW+0x1c4
02 02 000000be`74fff600 00007ff6`42e06a19 KERNELBASE!SleepConditionVariableSRW+0x38
000000be`74fff600 00007ff6`42e06a19 KERNELBASE!SleepConditionVariableSRW+0x38
03 03 000000be`74fff640 00007ff6`41785d7b PathOfExileSteam+0x22d6a19
000000be`74fff640 00007ff6`41785d7b PathOfExileSteam+0x22d6a19
04 04 000000be`74fff670 00007ff6`417838d1 PathOfExileSteam+0xc55d7b
000000be`74fff670 00007ff6`417838d1 PathOfExileSteam+0xc55d7b
05 05 000000be`74fff6a0 00007ff6`40cfb636 PathOfExileSteam+0xc538d1
000000be`74fff6a0 00007ff6`40cfb636 PathOfExileSteam+0xc538d1
06 06 000000be`74fff6f0 00007ff6`40cfaf71 PathOfExileSteam+0x1cb636
000000be`74fff6f0 00007ff6`40cfaf71 PathOfExileSteam+0x1cb636
07 07 000000be`74fff720 00007ff6`417860b9 PathOfExileSteam+0x1caf71
000000be`74fff720 00007ff6`417860b9 PathOfExileSteam+0x1caf71
08 08 000000be`74fff750 00007ff9`24ace8d7 PathOfExileSteam+0xc560b9
000000be`74fff750 00007ff9`24ace8d7 PathOfExileSteam+0xc560b9
09 09 000000be`74fff7b0 00007ff9`2633bf2c KERNEL32!BaseThreadInitThunk+0x17
000000be`74fff7b0 00007ff9`2633bf2c KERNEL32!BaseThreadInitThunk+0x17
0a 0a 000000be`74fff7e0 00000000`00000000 ntdll!RtlUserThreadStart+0x2c

18 Id: 298c.24b8 Suspend: 1 Teb: 000000be`6be60000 Unfrozen
# Child-SP RetAddr Call Site
000000be`74fff7e0 00000000`00000000 ntdll!RtlUserThreadStart+0x2c

18 Id: 298c.24b8 Suspend: 1 Teb: 000000be`6be60000 Unfrozen
# Child-SP RetAddr Call Site
00 00 000000be`757ffbd8 00007ff9`262f3524 ntdll!NtWaitForAlertByThreadId+0x14
000000be`757ffbd8 00007ff9`262f3524 ntdll!NtWaitForAlertByThreadId+0x14
01 01 000000be`757ffbe0 00007ff9`23afde78 ntdll!RtlSleepConditionVariableSRW+0x1c4
000000be`757ffbe0 00007ff9`23afde78 ntdll!RtlSleepConditionVariableSRW+0x1c4
02 02 000000be`757ffc80 00007ff6`42e06a19 KERNELBASE!SleepConditionVariableSRW+0x38
000000be`757ffc80 00007ff6`42e06a19 KERNELBASE!SleepConditionVariableSRW+0x38
03 03 000000be`757ffcc0 00007ff6`41785d7b PathOfExileSteam+0x22d6a19
000000be`757ffcc0 00007ff6`41785d7b PathOfExileSteam+0x22d6a19
04 04 000000be`757ffcf0 00007ff6`417838d1 PathOfExileSteam+0xc55d7b
000000be`757ffcf0 00007ff6`417838d1 PathOfExileSteam+0xc55d7b
05 05 000000be`757ffd20 00007ff6`40cfb636 PathOfExileSteam+0xc538d1
000000be`757ffd20 00007ff6`40cfb636 PathOfExileSteam+0xc538d1
06 06 000000be`757ffd70 00007ff6`40cfaf71 PathOfExileSteam+0x1cb636
000000be`757ffd70 00007ff6`40cfaf71 PathOfExileSteam+0x1cb636
07 07 000000be`757ffda0 00007ff6`417860b9 PathOfExileSteam+0x1caf71
000000be`757ffda0 00007ff6`417860b9 PathOfExileSteam+0x1caf71
08 08 000000be`757ffdd0 00007ff9`24ace8d7 PathOfExileSteam+0xc560b9
000000be`757ffdd0 00007ff9`24ace8d7 PathOfExileSteam+0xc560b9
09 09 000000be`757ffe30 00007ff9`2633bf2c KERNEL32!BaseThreadInitThunk+0x17
000000be`757ffe30 00007ff9`2633bf2c KERNEL32!BaseThreadInitThunk+0x17
0a 0a 000000be`757ffe60 00000000`00000000 ntdll!RtlUserThreadStart+0x2c

19 Id: 298c.209c Suspend: 1 Teb: 000000be`6be62000 Unfrozen
# Child-SP RetAddr Call Site
000000be`757ffe60 00000000`00000000 ntdll!RtlUserThreadStart+0x2c

19 Id: 298c.209c Suspend: 1 Teb: 000000be`6be62000 Unfrozen
# Child-SP RetAddr Call Site
00 00 000000be`75fff578 00007ff9`262f3524 ntdll!NtWaitForAlertByThreadId+0x14
000000be`75fff578 00007ff9`262f3524 ntdll!NtWaitForAlertByThreadId+0x14
01 01 000000be`75fff580 00007ff9`23afde78 ntdll!RtlSleepConditionVariableSRW+0x1c4
000000be`75fff580 00007ff9`23afde78 ntdll!RtlSleepConditionVariableSRW+0x1c4
02 02 000000be`75fff620 00007ff6`42e06a19 KERNELBASE!SleepConditionVariableSRW+0x38
000000be`75fff620 00007ff6`42e06a19 KERNELBASE!SleepConditionVariableSRW+0x38
03 03 000000be`75fff660 00007ff6`41785d7b PathOfExileSteam+0x22d6a19
000000be`75fff660 00007ff6`41785d7b PathOfExileSteam+0x22d6a19
04 04 000000be`75fff690 00007ff6`417838d1 PathOfExileSteam+0xc55d7b
000000be`75fff690 00007ff6`417838d1 PathOfExileSteam+0xc55d7b
05 05 000000be`75fff6c0 00007ff6`40cfb636 PathOfExileSteam+0xc538d1
000000be`75fff6c0 00007ff6`40cfb636 PathOfExileSteam+0xc538d1
06 06 000000be`75fff710 00007ff6`40cfaf71 PathOfExileSteam+0x1cb636
000000be`75fff710 00007ff6`40cfaf71 PathOfExileSteam+0x1cb636
07 07 000000be`75fff740 00007ff6`417860b9 PathOfExileSteam+0x1caf71
000000be`75fff740 00007ff6`417860b9 PathOfExileSteam+0x1caf71
08 08 000000be`75fff770 00007ff9`24ace8d7 PathOfExileSteam+0xc560b9
000000be`75fff770 00007ff9`24ace8d7 PathOfExileSteam+0xc560b9
09 09 000000be`75fff7d0 00007ff9`2633bf2c KERNEL32!BaseThreadInitThunk+0x17
000000be`75fff7d0 00007ff9`2633bf2c KERNEL32!BaseThreadInitThunk+0x17
0a 0a 000000be`75fff800 00000000`00000000 ntdll!RtlUserThreadStart+0x2c


That is just a snippet but the thing is : Thread 15 has the same lpStartAddress as the others ( bold text ) and yes, that is a return address not the start address of the thread but based on the assembly code the start address is the same. But for some reason thread 15 generates an exception.


"
text:0000000140C560B0 sub_140C560B0 proc near ; DATA XREF: sub_140C53930+102↑o
.text:0000000140C560B0 ; .pdata:0000000143D42BB0↓o
.text:0000000140C560B0 ; __unwind { // __CxxFrameHandler4
.text:0000000140C560B0 48 83 EC 58 sub rsp, 58h
.text:0000000140C560B4 E8 A7 4E 57 FF call sub_1401CAF60
.text:0000000140C560B9 90 nop <--- this is the return address
.text:0000000140C560BA 33 C0 xor eax, eax
.text:0000000140C560BC 48 83 C4 58 add rsp, 58h
.text:0000000140C560C0 C3 retn
.text:0000000140C560C0 ; } // starts at 140C560B0
.text:0000000140C560C0 sub_140C560B0 endp


And this is the code that creates those threads:

"
.text:0000000140C53A16 C7 43 20 00 00 08 00 mov dword ptr [rbx+20h], 80000h
.text:0000000140C53A1D 41 8B C6 mov eax, r14d
.text:0000000140C53A20 86 03 xchg al, [rbx]
.text:0000000140C53A22 8B 53 20 mov edx, [rbx+20h] ; dwStackSize
.text:0000000140C53A25 4C 89 74 24 28 mov [rsp+0A8h+lpThreadId], r14 ; lpThreadId
.text:0000000140C53A2A 44 89 74 24 20 mov [rsp+0A8h+dwCreationFlags], r14d ; dwCreationFlags
.text:0000000140C53A2F 4C 8B CB mov r9, rbx ; lpParameter
.text:0000000140C53A32 4C 8D 05 77 26 00 00 lea r8, sub_140C560B0 ; lpStartAddress
.text:0000000140C53A39 33 C9 xor ecx, ecx ; lpThreadAttributes
.text:0000000140C53A3B FF 15 07 E9 8D 01 call cs:CreateThread <-------- This is the call that generates the thread
.text:0000000140C53A41 48 89 43 08 mov [rbx+8], rax
.text:0000000140C53A45 48 85 C0 test rax, rax
.text:0000000140C53A48 74 5C jz short loc_140C53AA6
.text:0000000140C53A4A EB 03 jmp short loc_140C53A4F



And those other threads that don't generate an exception are waiting and here is the code:

"
.text:00000001422D69F4 40 53 push rbx
.text:00000001422D69F6 48 83 EC 20 sub rsp, 20h
.text:00000001422D69FA 83 4A 48 FF or dword ptr [rdx+48h], 0FFFFFFFFh
.text:00000001422D69FE 48 8B DA mov rbx, rdx
.text:00000001422D6A01 FF 4A 4C dec dword ptr [rdx+4Ch]
.text:00000001422D6A04 48 83 C1 08 add rcx, 8 ; ConditionVariable
.text:00000001422D6A08 48 83 C2 10 add rdx, 10h ; SRWLock
.text:00000001422D6A0C 45 33 C9 xor r9d, r9d ; Flags <-------- Exclusive lock
.text:00000001422D6A0F 41 83 C8 FF or r8d, 0FFFFFFFFh ; dwMilliseconds
.text:00000001422D6A13 FF 15 77 BC 25 00 call cs:SleepConditionVariableSRW <----- Call that makes other threads wait
.text:00000001422D6A19 85 C0 test eax, eax


And this code is called from here ( from sub_140C55D10 ):

"

.text:0000000140C55D10 40 57 push rdi
.text:0000000140C55D12 48 83 EC 20 sub rsp, 20h
.text:0000000140C55D16 48 8B 41 08 mov rax, [rcx+8]
.text:0000000140C55D1A 48 8B F9 mov rdi, rcx <---------- First parameter
.text:0000000140C55D1D 0F B6 80 10 01 00 00 movzx eax, byte ptr [rax+110h]
.text:0000000140C55D24 84 C0 test al, al
.text:0000000140C55D26 74 6F jz short loc_140C55D97
.text:0000000140C55D28
.text:0000000140C55D28 loc_140C55D28: ; DATA XREF: .rdata:0000000142CD107C↓o
.text:0000000140C55D28 ; .rdata:0000000142CD108C↓o ...
.text:0000000140C55D28 48 89 5C 24 30 mov [rsp+28h+arg_0], rbx
.text:0000000140C55D2D 0F 1F 00 nop dword ptr [rax]
.text:0000000140C55D30
.text:0000000140C55D30 loc_140C55D30: ; CODE XREF: sub_140C55D10+80↓j
.text:0000000140C55D30 48 8B 47 20 mov rax, [rdi+20h]
.text:0000000140C55D34 4C 8B 47 18 mov r8, [rdi+18h]
.text:0000000140C55D38 48 8B 57 10 mov rdx, [rdi+10h]
.text:0000000140C55D3C 48 8B 4F 08 mov rcx, [rdi+8]
.text:0000000140C55D40 44 8B 48 28 mov r9d, [rax+28h]
.text:0000000140C55D44 44 03 48 24 add r9d, [rax+24h]
.text:0000000140C55D48 E8 A3 DD FF FF call sub_140C53AF0
.text:0000000140C55D4D 84 C0 test al, al
.text:0000000140C55D4F 75 32 jnz short loc_140C55D83
.text:0000000140C55D51 48 8B 5F 08 mov rbx, [rdi+8] <------ RBX comes from here ( a condition variable is read from rbx+0x50 -> see below), and RDI is the first parameter or this function
.text:0000000140C55D55 48 83 C3 30 add rbx, 30h ; '0'
.text:0000000140C55D59 48 8B CB mov rcx, rbx
.text:0000000140C55D5C E8 BF 3B 68 01 call sub_1422D9920
.text:0000000140C55D61 85 C0 test eax, eax
.text:0000000140C55D63 75 48 jnz short loc_140C55DAD
.text:0000000140C55D65 8B 43 4C mov eax, [rbx+4Ch]
.text:0000000140C55D68 3D FF FF FF 7F cmp eax, 7FFFFFFFh
.text:0000000140C55D6D 74 2E jz short loc_140C55D9D
.text:0000000140C55D6F 48 8D 4B 50 lea rcx, [rbx+50h] <------ Condition variable
.text:0000000140C55D73 48 8B D3 mov rdx, rbx
.text:0000000140C55D76 E8 79 0C 68 01 call sub_1422D69F4 <------ This is the call to the above function that calls SleepConditionVariableSRW
.text:0000000140C55D7B 48 8B CB mov rcx, rbx ; _Mtx_t
.text:0000000140C55D7E E8 A5 3B 68 01 call _Mtx_unlock


Then I searched for a call to this function (sub_140C55D10) to try to understand what might cause the exception but there are no calls. At least not in the main executable. All I could found was an array that contains this function:

"
.rdata:00000001427D3C30 C0 5D C5 40 01 00 00 00 off_1427D3C30 dq offset loc_140C55DC0 ; DATA XREF: sub_140C53CD0+390↑o
.rdata:00000001427D3C30 ; .text:loc_140C55DC0↑o
.rdata:00000001427D3C38 C0 5D C5 40 01 00 00 00 dq offset loc_140C55DC0
.rdata:00000001427D3C40 10 5D C5 40 01 00 00 00 dq offset sub_140C55D10
.rdata:00000001427D3C48 00 5D C5 40 01 00 00 00 dq offset sub_140C55D00
.rdata:00000001427D3C50 20 75 11 40 01 00 00 00 dq offset sub_140117520
.rdata:00000001427D3C58 40 4E 0D 40 01 00 00 00 dq offset ?GetLocaleT@_LocaleUpdate@@QEAAPEAU__crt_locale_pointers@@XZ ; _LocaleUpdate::GetLocaleT(void)



Then I've searched for that array in the code:
"
.text:0000000140C54054 48 8B 1E mov rbx, [rsi]
.text:0000000140C54057 48 8B 76 08 mov rsi, [rsi+8]
.text:0000000140C5405B 48 3B DE cmp rbx, rsi
.text:0000000140C5405E 74 6A jz short loc_140C540CA
.text:0000000140C54060 4C 8D 2D C9 FB B7 01 lea r13, off_1427D3C30 <------ the array
.text:0000000140C54067 4C 8B B5 38 01 00 00 mov r14, [rbp+100h+arg_28]
.text:0000000140C5406E 4C 8B BD 30 01 00 00 mov r15, [rbp+100h+arg_20]
.text:0000000140C54075 4C 8B A5 28 01 00 00 mov r12, [rbp+100h+arg_18]
.text:0000000140C5407C 0F 1F 40 00 nop dword ptr [rax+00h]
.text:0000000140C54080
.text:0000000140C54080 loc_140C54080: ; CODE XREF: sub_140C53CD0+3F8↓j
.text:0000000140C54080 48 89 7C 24 48 mov qword ptr [rsp+200h+pExceptionObject], rdi
.text:0000000140C54085 4C 89 7C 24 50 mov qword ptr [rsp+200h+pExceptionObject+8], r15
.text:0000000140C5408A 4C 89 74 24 58 mov [rsp+58h], r14
.text:0000000140C5408F 48 89 5C 24 60 mov [rsp+200h+var_1A0], rbx
.text:0000000140C54094 4C 89 6D 88 mov [rbp+100h+var_178], r13
.text:0000000140C54098 0F 10 44 24 48 movups xmm0, [rsp+200h+pExceptionObject]
.text:0000000140C5409D 0F 11 45 90 movups [rbp+100h+var_170], xmm0
.text:0000000140C540A1 0F 10 4C 24 58 movups xmm1, xmmword ptr [rsp+58h]
.text:0000000140C540A6 0F 11 4D A0 movups [rbp+100h+var_160], xmm1
.text:0000000140C540AA 48 8D 45 88 lea rax, [rbp+100h+var_178]
.text:0000000140C540AE 48 89 45 C0 mov [rbp+100h+var_140], rax
.text:0000000140C540B2 4C 8D 45 88 lea r8, [rbp+100h+var_178]



Ok, so this looks like a function that prepares an EXCEPTION_RECORD struct or something like that. Now this code seems to be called only if cmp rbx, rsi is NOT true ( RBX != RSI ) and RBX and RSI are two QWORDs that are sequentially in memory RBX = *RSI and then RSI = *(RSI+8). Now I was trying to understand what are those and when RBX != RSI but unfortunately I don't have too much time now. All I've seen was a
.text:0000000140C53EFC 48 8D B7 F8 00 00 00 lea rsi, [rdi+0F8h]
and
.text:0000000140C53CF8 49 8B F0 mov rsi, r8

So RSI comes initially from RDI+0xF8 or from the third parameter ?? ( although it's a variadic function ) ( probably first case -> RDI+0xF8 ).
And while I am writing this, Im pretty sure it's from [rdi+0xf8]. Seeing that 0xf8 I was like "WAIT A MINUTE!". I know that value. It's the offset of RIP from the _CONTEXT structure :).
"

0:015> dt -r _CONTEXT
MSVCP140!_CONTEXT
+0x000 P1Home : Uint8B
+0x008 P2Home : Uint8B
+0x010 P3Home : Uint8B
+0x018 P4Home : Uint8B
+0x020 P5Home : Uint8B
+0x028 P6Home : Uint8B
+0x030 ContextFlags : Uint4B
+0x034 MxCsr : Uint4B
+0x038 SegCs : Uint2B
+0x03a SegDs : Uint2B
+0x03c SegEs : Uint2B
+0x03e SegFs : Uint2B
+0x040 SegGs : Uint2B
+0x042 SegSs : Uint2B
+0x044 EFlags : Uint4B
+0x048 Dr0 : Uint8B
+0x050 Dr1 : Uint8B
+0x058 Dr2 : Uint8B
+0x060 Dr3 : Uint8B
+0x068 Dr6 : Uint8B
+0x070 Dr7 : Uint8B
+0x078 Rax : Uint8B
+0x080 Rcx : Uint8B
+0x088 Rdx : Uint8B
+0x090 Rbx : Uint8B
+0x098 Rsp : Uint8B
+0x0a0 Rbp : Uint8B
+0x0a8 Rsi : MSVCP140!_CONTEXT
+0x000 P1Home : Uint8B
+0x008 P2Home : Uint8B
+0x010 P3Home : Uint8B
+0x018 P4Home : Uint8B
+0x020 P5Home : Uint8B
+0x028 P6Home : Uint8B
+0x030 ContextFlags : Uint4B
+0x034 MxCsr : Uint4B
+0x038 SegCs : Uint2B
+0x03a SegDs : Uint2B
+0x03c SegEs : Uint2B
+0x03e SegFs : Uint2B
+0x040 SegGs : Uint2B
+0x042 SegSs : Uint2B
+0x044 EFlags : Uint4B
+0x048 Dr0 : Uint8B
+0x050 Dr1 : Uint8B
+0x058 Dr2 : Uint8B
+0x060 Dr3 : Uint8B
+0x068 Dr6 : Uint8B
+0x070 Dr7 : Uint8B
+0x078 Rax : Uint8B
+0x080 Rcx : Uint8B
+0x088 Rdx : Uint8B
+0x090 Rbx : Uint8B
+0x098 Rsp : Uint8B
+0x0a0 Rbp : Uint8B
+0x0a8 Rsi : Uint8B
+0x0b0 Rdi : Uint8B
+0x0b8 R8 : Uint8B
+0x0c0 R9 : Uint8B
+0x0c8 R10 : Uint8B
+0x0d0 R11 : Uint8B
+0x0d8 R12 : Uint8B
+0x0e0 R13 : Uint8B
+0x0e8 R14 : Uint8B
+0x0f0 R15 : Uint8B
+0x0f8 Rip : Uint8B <--------- here
+0x100 FltSave : _XSAVE_FORMAT
+0x000 ControlWord : Uint2B

And every thread has such a structure. So I am pretty sure rdi holds the _CONTEXT structure.
Idk how much this helps ( I hope it does ) but I guess at least I can come back to it when I have some more time.
I used to crashed to my desktop every 5m. After I lower my pcore to 46 I haven't crashed since. Thank you!
"
IceCool10#6669 написал:
Long Block Of Code


Before we start: Please run 0:015> r.

My observations:

Thread 15 (502c): Raising an Exception but more importantly it is not waiting, instead it is actively crashing. If this thread was supposed to signal one of the waiting threads, the wake-up signal is lost, causing the other threads to remain stuck. In our case it is.

Threads 16, 17, 18, 19: These are stuck in SleepConditionVariableSRW(). Since Thread 15 crashed it will never come and they will remain stuck forever.

Them sharing the same address means thread 15 was performing a critical task but failed, leaving the others in limbo.

The next block is an exception handling method as evidenced by the existence of CxxFrameHandler4.

After returning from sub_1401CAF60, the function:
1) Executes a nop (likely for alignment or debugging).

2) Clears the eax register (xor eax, eax), meaning it is returning 0. Returning 0 indicates success if they are following the standard coding practices.

3) Restores the stack (add rsp, 58h).

4)Returns (retn). Return is 0.

Since sub_140C560B0 only calls sub_1401CAF60 and returns, it is unlikely that sub_140C560B0 itself caused the exception.
Instead, sub_1401CAF60 is the function that either crashed or explicitly threw an exception.

If sub_1401CAF60 performed an invalid operation (for example dereferencing a null pointer, accessing an invalid memory location, or causing a divide-by-zero error), it could trigger an access violation (0xC0000005).

If sub_1401CAF60 encountered an assertion failure or logic error, it could have explicitly called RaiseException(), causing Thread 15 to crash.

If sub_1401CAF60 was supposed to signal a condition variable before returning, but instead crashed, then:
Thread 15 stopped before waking up waiting threads (Threads 16-19).
This left those threads stuck in SleepConditionVariableSRW().
The result: a deadlock, leading to a system freeze.

Continuing on for the block "this is the code that creates those threads":

The thread stack size is being set (dwStackSize = 0x80000 or 512KB). This means the thread is given a dedicated stack size, but not an unusually large one.

Now this in itself can give us actual details about what sub_1401CAF60 which is called by sub_140C560B0 supposed to do because Explicit Stack Size is often used only on certain things and we know from your previous post that there is a recurring pattern of function calls for DX12 so this is most likely:

Shader compilation. Other possibilities are: Command buffer generation, scene rendering traversal.

For a Vulkan/DX12 worker thread handling deep recursion, large GPU structures, or multi-threaded rendering 512KB is quite low.

Now... I both want this to be true and false at the same time but...

0x80000 is 512KB
0x800000 is 8MB.

8MB is also the suggested stack size for heavy workloads such as... Deep recursion. It is also small enough to be missed.

If this is not it then 512KB is just a red herring. But still it is quite low in my opinion since even the default is 1MB. A well optimized code could be able to run this in a way that Toyota Hilux was running at the end of Top Gear.

Why I'm focused on this:
If the thread overflows its stack and corrupts kernel memory, it can cause a system-wide freeze instead of just crashing the application. Some Windows drivers use the same kernel stack memory region, meaning an out-of-bounds write could cause a hard lockup.

Anyway... Continuing on from "those other threads that don't generate an exception are waiting and here is the code":

This is a System API. And it points out to the following scenario:

1) If Thread 15 is on deep recursion and exhausted its 512 KB stack, it would crash before completing execution.

2) It would crash before calling WakeConditionVariable()

3) Without WakeConditionVariable() no threads are ever woken up, leaving the others stuck.

4) If these threads were rendering threads, the entire graphics pipeline would stall, leading to a system freeze.

Continuing from "this code is called from here ( from sub_140C55D10 )":

This function appears to be preparing and waiting on a condition variable, ensuring that a certain event or resource becomes available before proceeding. The key is that it eventually calls sub_1422D69F4, which in turn calls SleepConditionVariableSRW().

This means that if the expected condition is never met, the thread will wait indefinitely.

rdi is the first function parameter, meaning this function is likely operating on an object (for example a synchronization object, a queue, or a resource handler).

Continuing from "The Array":
I believe this is a thread pool managing GPU work. A GPU task scheduler could assign worker threads to functions in this list. A failure (such as stack overflow in Thread 15) could disrupt the entire system, leaving worker threads waiting.

Continuing from "Then I've searched for that array in the code":

I'm now 99% sure this is the thread pool managing GPU work. The function iterates through a list of work items or jobs (rsi linked structure). It loads a function pointer table (off_1427D3C30), meaning it dynamically selects which function to execute.

There’s exception handling (pExceptionObject), but if a failure is not properly handled, it could leave threads stuck.

We know it is not properly handling.

The final box:

YOU MIGHT HAVE SOLVED IT. OR COME VERY CLOSE TO IT.

Please run 0:015> r.

It would print all register values, including Rip, Rsp, and Rbp, which could confirm if:

If Rip is in RaiseException(), the crash was likely triggered deliberately (assertion failure, runtime abort, etc.).

If Rip is an invalid address, the stack may have overflown, corrupting return addresses.

If Rip points to a function in PathOfExileSteam, the game’s threading code is failing internally.

If Rsp is abnormally low, it strengthens the case that 512 KB was too small, leading to a stack overflow.

TLDR:
There might be a typo at the point where they set the stack sizes.

0x80000 is 512KB
0x800000 is 8MB.

The size is set as 0x80000.


Obligatory:
If only GGG were honest we would not even have to have this conversation... We could simply look at GGGs explanation of the situation with proper technical information but we can never know why exactly this is happening as GGG keeps being dodgy and dishonest. By the way, Microsoft is still not acknowledging this is a Windows 11 24H2 issue as claimed by GGG.

As long as GGG is not interested in open and honest communication our only other option is to increase the pressure and warn others by giving a negative review for Path of Exile 2 on Steam in a detailed and informative manner.


I cannot send/reply to direct messages because my in-game character has not finished Act 1.
What to do:
1)Write a short review about the hard crashes in notepad.
2)Copy and paste it to steam reviews, put up a negative review.
3)Copy and paste it to steam discussions, put it up there.
Последняя редакция: Cainrith#2807. Время: 18 февр. 2025 г., 20:22:47
"
Braric#4417 написал:
Someone should start a class action lawsuit to refund the early access purchase price.

They delivered not even half of what they promised in EA and the game is actually unplayable.


Not only will it not work, it's completely non-applicable. This is an early access game. Early access is defined as:

Early access, also known as alpha access, alpha founding, paid alpha, or game preview, is a funding model in the video game industry by which consumers can purchase and play a game in the various pre-release development cycles, such as pre-alpha, alpha, and/or beta, while the developer is able to use those funds to continue further development on the game. Those that pay to participate typically help to debug the game, provide feedback and suggestions, may have access to special materials in the game. The early-access approach is a common way to obtain funding for indie games, and may also be used along with other funding mechanisms, including crowdfunding. Many crowdfunding projects promise to offer access to alpha and/or beta versions of the game as development progresses; however, unlike some of these projects which solicit funds but do not yet have a playable game, all early access games offer an immediately playable version of the unfinished game to players.

So, you didn't "buy" anything. You contributed to the development of a game slated to be free to play later this year, and in exchange for that, you got a work in progress to play and bug test.

I get the frustration of spending money and having issues. I do. But this misconception of "I should get a finished game" needs to end. You bought access to an alpha/beta. If that's too much for some people and uninstalling is what's right for their peace of mind, then aces. But let's stop trying to incite legal this and legal that when there's no leg to stand on when people went in with at least the correct understanding made available to them. If they were in a rush to play and didn't read through what they signed up for, then that's on them, not GGG.
"
Cainrith#2807 написал:
"
IceCool10#6669 написал:
Long Block Of Code


Before we start: Please run 0:015> r.

My observations:

Thread 15 (502c): Raising an Exception but more importantly it is not waiting, instead it is actively crashing. If this thread was supposed to signal one of the waiting threads, the wake-up signal is lost, causing the other threads to remain stuck. In our case it is.

Threads 16, 17, 18, 19: These are stuck in SleepConditionVariableSRW(). Since Thread 15 crashed it will never come and they will remain stuck forever.

Them sharing the same address means thread 15 was performing a critical task but failed, leaving the others in limbo.

The next block is an exception handling method as evidenced by the existence of CxxFrameHandler4.

After returning from sub_1401CAF60, the function:
1) Executes a nop (likely for alignment or debugging).

2) Clears the eax register (xor eax, eax), meaning it is returning 0. Returning 0 indicates success if they are following the standard coding practices.

3) Restores the stack (add rsp, 58h).

4)Returns (retn). Return is 0.

Since sub_140C560B0 only calls sub_1401CAF60 and returns, it is unlikely that sub_140C560B0 itself caused the exception.
Instead, sub_1401CAF60 is the function that either crashed or explicitly threw an exception.

If sub_1401CAF60 performed an invalid operation (for example dereferencing a null pointer, accessing an invalid memory location, or causing a divide-by-zero error), it could trigger an access violation (0xC0000005).

If sub_1401CAF60 encountered an assertion failure or logic error, it could have explicitly called RaiseException(), causing Thread 15 to crash.

If sub_1401CAF60 was supposed to signal a condition variable before returning, but instead crashed, then:
Thread 15 stopped before waking up waiting threads (Threads 16-19).
This left those threads stuck in SleepConditionVariableSRW().
The result: a deadlock, leading to a system freeze.

Continuing on for the block "this is the code that creates those threads":

The thread stack size is being set (dwStackSize = 0x80000 or 512KB). This means the thread is given a dedicated stack size, but not an unusually large one.

Now this in itself can give us actual details about what sub_1401CAF60 which is called by sub_140C560B0 supposed to do because Explicit Stack Size is often used only on certain things and we know from your previous post that there is a recurring pattern of function calls for DX12 so this is most likely:

Shader compilation. Other possibilities are: Command buffer generation, scene rendering traversal.

For a Vulkan/DX12 worker thread handling deep recursion, large GPU structures, or multi-threaded rendering 512KB is quite low.

Now... I both want this to be true and false at the same time but...

0x80000 is 512KB
0x800000 is 8MB.

8MB is also the suggested stack size for heavy workloads such as... Deep recursion. It is also small enough to be missed.

If this is not it then 512KB is just a red herring. But still it is quite low in my opinion since even the default is 1MB. A well optimized code could be able to run this in a way that Toyota Hilux was running at the end of Top Gear.

Why I'm focused on this:
If the thread overflows its stack and corrupts kernel memory, it can cause a system-wide freeze instead of just crashing the application. Some Windows drivers use the same kernel stack memory region, meaning an out-of-bounds write could cause a hard lockup.

Anyway... Continuing on from "those other threads that don't generate an exception are waiting and here is the code":

This is a System API. And it points out to the following scenario:

1) If Thread 15 is on deep recursion and exhausted its 512 KB stack, it would crash before completing execution.

2) It would crash before calling WakeConditionVariable()

3) Without WakeConditionVariable() no threads are ever woken up, leaving the others stuck.

4) If these threads were rendering threads, the entire graphics pipeline would stall, leading to a system freeze.

Continuing from "this code is called from here ( from sub_140C55D10 )":

This function appears to be preparing and waiting on a condition variable, ensuring that a certain event or resource becomes available before proceeding. The key is that it eventually calls sub_1422D69F4, which in turn calls SleepConditionVariableSRW().

This means that if the expected condition is never met, the thread will wait indefinitely.

rdi is the first function parameter, meaning this function is likely operating on an object (for example a synchronization object, a queue, or a resource handler).

Continuing from "The Array":
I believe this is a thread pool managing GPU work. A GPU task scheduler could assign worker threads to functions in this list. A failure (such as stack overflow in Thread 15) could disrupt the entire system, leaving worker threads waiting.

Continuing from "Then I've searched for that array in the code":

I'm now 99% sure this is the thread pool managing GPU work. The function iterates through a list of work items or jobs (rsi linked structure). It loads a function pointer table (off_1427D3C30), meaning it dynamically selects which function to execute.

There’s exception handling (pExceptionObject), but if a failure is not properly handled, it could leave threads stuck.

We know it is not properly handling.

The final box:

YOU MIGHT HAVE SOLVED IT. OR COME VERY CLOSE TO IT.

Please run 0:015> r.

It would print all register values, including Rip, Rsp, and Rbp, which could confirm if:

If Rip is in RaiseException(), the crash was likely triggered deliberately (assertion failure, runtime abort, etc.).

If Rip is an invalid address, the stack may have overflown, corrupting return addresses.

If Rip points to a function in PathOfExileSteam, the game’s threading code is failing internally.

If Rsp is abnormally low, it strengthens the case that 512 KB was too small, leading to a stack overflow.

TLDR:
There might be a typo at the point where they set the stack sizes.

0x80000 is 512KB
0x800000 is 8MB.

The size is set as 0x80000.


Obligatory:
If only GGG were honest we would not even have to have this conversation... We could simply look at GGGs explanation of the situation with proper technical information but we can never know why exactly this is happening as GGG keeps being dodgy and dishonest. By the way, Microsoft is still not acknowledging this is a Windows 11 24H2 issue as claimed by GGG.

As long as GGG is not interested in open and honest communication our only other option is to increase the pressure and warn others by giving a negative review for Path of Exile 2 on Steam in a detailed and informative manner.




Not GPU related : it is a thread stack that is handling some sort of watchdog for internet connection and responsible for server hop in case it didn't find any availabie instance. Except the thread crap itself with jumbo frame and modern way of handling network. POE1 is plagged with exactly the same code and it's been ages it hasn't been changed.

You can somehow make the code run even worse tinkering with your MTU size and/or playing with your DNS such as using google DNS.

And it is not a deadlock, as if the thread goes non responding, the main loop create another one while the old is zombified in the CPU command queue : it is litteral fork bomb (as it only clear all of its instances if a successful connection happens)
"
KissFC#2626 написал:

Not GPU related : it is a thread stack that is handling some sort of watchdog for internet connection and responsible for server hop in case it didn't find any availabie instance. Except the thread crap itself with jumbo frame and modern way of handling network. POE1 is plagged with exactly the same code and it's been ages it hasn't been changed.

You can somehow make the code run even worse tinkering with your MTU size and/or playing with your DNS such as using google DNS.

And it is not a deadlock, as if the thread goes non responding, the main loop create another one while the old is zombified in the CPU command queue : it is litteral fork bomb (as it only clear all of its instances if a successful connection happens)


So, basically, you know exactly where this freeze happens and originates from and in what circumstances it may happen.

So in summary, according to you, some piece of code that is suppose to handle the case where there are no available instances to host the map (could be server issues, or personal internet problems, or just random lag etc) is not working properly, which in turn makes the main loop start to mass-produce threads until a successful connection is made. So if a connection is made before the computer crashes we are good, and if not then total freeze.

This explains why the freeze only happens when loading a new map. It explains why it seems to happen at random times. It kind of explains why there seems to be no correlation between hardware and software and the likelihood of getting a crash. nvida, amd, intel, drivers, bios, windows version etc, makes no difference.

It all comes down to how stable your connection is, how well your DNS is performing that day, your ISP, and how well the servers are feeling etc.

Does this mean that freezes are more likely to happen during times where many ppl play, since it may take longer to get a free instance to host the map on? It it worth trying to play with a cable instead of wifi (I think not but every millisecond matters I guess)?

If this is true its honestly incredible. GGG is disabling multi-threading on load screens as a temporary solution to this and seems to think its Microsofts fault somehow. To me, with my very limited knowledge, this seems like it should be relatively easy to find and fix right? Or do you think its a complicated bug? Im so confused.
"
snurrfint#5780 написал:

(...)
This explains why the freeze only happens when loading a new map. It explains why it seems to happen at random times.
(...)


First, thank you guys for spending time to look into that.

Now, Freeze may not only happen when loading maps, but mainly.

Outside of loading screen seems to be very rare, but they do seem to occur.
I had it after 0.0.1e, when the monsters got spawned on the map by trialmaster and also this week when my friend ported to me at the beginning of the vanguard dreadnought (when his char got spawned maybe?). I can't be 100% that it is the same bug, but, those were also full freeze, with slow mouse cursor and nothing else responding after something got loaded. Pretty hard to reproduce outside of loading screen though.

Big patch fixed the issue for me, so I was very surprised when it happened, but yeah, outside of loading screen, as far as I know the workaround is not used. Hope this help even a little bit.

"
monkeyskank#1595 написал:
"
snurrfint#5780 написал:

(...)
This explains why the freeze only happens when loading a new map. It explains why it seems to happen at random times.
(...)


First, thank you guys for spending time to look into that.

Now, Freeze may not only happen when loading maps, but mainly.

Outside of loading screen seems to be very rare, but they do seem to occur.
I had it after 0.0.1e, when the monsters got spawned on the map by trialmaster and also this week when my friend ported to me at the beginning of the vanguard dreadnought (when his char got spawned maybe?). I can't be 100% that it is the same bug, but, those were also full freeze, with slow mouse cursor and nothing else responding after something got loaded. Pretty hard to reproduce outside of loading screen though.

Big patch fixed the issue for me, so I was very surprised when it happened, but yeah, outside of loading screen, as far as I know the workaround is not used. Hope this help even a little bit.



Well. I also had complete freeze when opening the caravan map for example. I don't know why, but I have a feeling the map is hosted on a different server or instance somehow compared to the main game. It takes a really long time to load sometimes and it even comes with the cogweels of death. Bottom line is, it probably need to contact something from outside to fetch the info it needs to render the map. So its possible that the same code runs there. Again, this is pure speculation.

When your friend ported to you, maybe the game needed both of you "moved" to a new instance for some reason? Or maybe its a completely unrelated crash as you mentioned. The amount of random freezes outside of actual map loads are extremely limited. It happed to me once. Freezes during map loads however...

Im saying this as someone who know absolutely nothing about how the game works. So take everything I say and have said regarding this with healthy scoop of salt.
Oh my bad I got things mixed up with all the quotes and replies, I thought you were the person analysing the code/connection. Sorry.

I am not sure how instances work either, but it just felt weird to have the infamous freeze with only my friend spawning.

Also yes the map is funny sometimes, especially the caravan one, it opens fast for me now, but get the checker texture for half a second most of the time before it changes to what it needs to be.

Пожаловаться на запись форума

Пожаловаться на учетную запись:

Тип жалобы

Дополнительная информация