ThreadAbortException: Thread was being aborted. 질문

서버로 단기간에 초당 20건이상 많은 요청을 보내자마자 앱을 바로 종료 후
재접속시
SendQueue.StartSendQueue(true, ExceptionHandler);

ExceptionHandler 콜백에서
System.Threading.ThreadAbortException: Thread was being aborted.
오류가 발생합니다

해당 오류는 뒤끝 서버의(타임아웃등) 문제인가요?

아래는 실제 로그입니다

System.Threading.ThreadAbortException: Thread was being aborted.
at System.Threading.WaitHandle.WaitOneNative (System.Runtime.InteropServices.SafeHandle waitableSafeHandle, System.UInt32 millisecondsTimeout, System.Boolean hasThreadAffinity, System.Boolean exitContext) [0x00000] in <00000000000000000000000000000000>:0
at System.Threading.WaitHandle.InternalWaitOne (System.Runtime.InteropServices.SafeHandle waitableSafeHandle, System.Int64 millisecondsTimeout, System.Boolean hasThreadAffinity, System.Boolean exitContext) [0x00000] in <00000000000000000000000000000000>:0
at BackEnd.SendQueue.k4UDwmwwy1 () [0x00000] in <00000000000000000000000000000000>:0
at System.Threading.Tasks.Task.Execute () [0x00000] in <00000000000000000000000000000000>:0
at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <00000<\M-b\M^@\M-&>

안녕하세요 개발자님,
ThreadAbortException은 실행중인 스레드가 중단되면서 발생하는 에러입니다.
호출했던 샌드큐 작업이 외부 쓰레드에서 실행되고, 앱을 종료 시 강제로 종료되는데,
이로 인해 발생하게 되는 부분이니 참고하여 주시면 감사하겠습니다.

현재 일부 기기에서 해당 사유로 크래쉬가 발생하는걸 의심하고 있는데

이걸 안전하게 방지할 수 있는 방법이 있나요?

private void OnApplicationPause(bool pause)
{
if (pause == true)
{
// 게임이 Pause 되었을 때
SendQueue.PauseSendQueue();
}
else if (pause == false)
{
SendQueue.ResumeSendQueue();
}
}

private void OnApplicationQuit()
{
    SendQueue.StopSendQueue();
}

이런 처리는 다 되어있습니다

확실하게 해결할 수 있는 방법이 있는지도 궁금합니다

추가적으로 IOS기기에서 확인해보니 메모리 한계 도달 익셉션이 떴는데
(lldb) thread info
thread #45: tid = 0x4529c, 0x000000022d375dcc AGXMetalA12`void AGX::Texture<(AGXTextureMemoryLayout)2, AGX::G11::Encoders, AGX::G11::Classes>::processCompressedRegion2D<AGX::AppleCompressionGen1::Compressor<SimplePixel<unsigned char, 1ul>, unsigned char, short, 1ul, (unsigned char)0, 8u, 0u, 0u, 0u, 1ul, 8ul, 8ul, 1u>, false, (AGXHardwareTextureMemoryOrder)2>(void*, void const*, void*, MTLPixelFormat, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int, unsigned int) const + 1876, name = ‘UnityGfxDeviceWorker’, stop reason = EXC_RESOURCE (RESOURCE_TYPE_MEMORY: high watermark memory limit exceeded) (limit=1850 MB)

강제종료시 센드큐 외부스레드가 끝나지 않아 재실행할때마다 중첩되어 남아있을 가능성도 있을까요?

확인 후 안내드리도록 하겠습니다.
시간 양해 부탁드립니다.

좋아요 1

게임 종료 직전 함수를 호출하고
게임을 종료 후 아직 Task 정리가 전부 발생하지 않은 상황이라면
다시 재접속할때 서버에서의 처리가 완료되면서 클라이언트로 전송되어 해당 에러가 발생할 가능성이 있는 것으로 확인됩니다.

BackEnd.SendQueue.StopSendQueue();를 호출할 경우, 샌드큐에서 이용중인 쓰레드를 종료하므로 해당 함수가 호출되는지 확인해 주시면 감사하겠습니다.

    void OnApplicationQuit()
    {
        // 어플리케이션이 종료되었을 때 SendQueue를 정지 시킴
        BackEnd.SendQueue.StopSendQueue();
        Debug.Log("샌드 큐 초기화");
    }

OnApplicationQuit은 아시다시피 앱을 강제종료하면 100% 호출된다는 보장이 없습니다

제가 가지고있는 기기에서 제대로 호출이 된다고 하더라도
다른 기기나 다른 운영체제에서 테스트해보면 결과가 다를수도 있습니다.

따라서 말씀해주신 StopSendQueue 호출이 안될 가능성이 있는데

앱실행 → 앱강제종료를 계속 반복할경우 문제가 있는지 또 문제가 있다면
이 이슈를 어떻게 해결을하는지도 알려주시면 감사하겠습니다

추가 문의하신 내용은 확인 중에 있습니다.
다소 시간이 소요되고 있는 점 양해 부탁드립니다.

좋아요 1

금일 업데이트를 통해 제공되는 베이스 SDK 5.12.0 버전부터는 외부 쓰레드에서 사용하지 않도록 변경이 되었으며, 이를 통해서 해결되었습니다.

단, 통신 라이브러리 교체를 통해 여러 변경점이 있기에,
SDK 업데이트 시 충분한 테스트를 거쳐 라이브에 적용하여 주시면 감사하겠습니다.

좋아요 1

넵 해결해주셔서 감사합니다!!