인프런 커뮤니티 질문&답변

가랑눈님의 프로필 이미지
가랑눈

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

데드락 관련해서 질문이 있습니다. 루키스님!

해결된 질문

작성

·

386

1

데드락 관련해서 버그가 떠서 질문글을 남깁니다.

윈도우 어플리케이션을 생성해서 윈도우 메인에 서버에게 C_LOGIN을 보내는 패킷을 생성했습니다. 밑은 해당 코드입니다.

 bool flag = true;
    while (true)
    {
        if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
        {
            if (WM_QUIT == msg.message)
                break;

            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }

        else
        {
            CEngine::GetInst()->progress();

            CEditorObjMgr::GetInst()->progress();

            ImGuiMgr::GetInst()->progress();

            // 렌더 종료
            CDevice::GetInst()->Present();

            if (service->GetCurrentSessionCount() > 0 && KEY_RELEASE(KEY::A) && flag == true) {
                Protocol::C_LOGIN pkt;
                auto sendBuffer = ServerPacketHandler::MakeSendBuffer(pkt);
                sendBuffer = nullptr;
                flag = false;
            }
        }
    }
    return (int) msg.wParam;
}

A를 클릭해서 서버와 연결한 후에 X를 눌러서 윈도우 창을 닫았는데, 이후

이렇게 코어글로벌이 종료될 때, GSendBufferManager를 delete하는 부분에서 타고타고 들어가서 DeadLockProfiler가 DeadLock이 존재했다고, 알려줬습니다.

Server에 OnConnected가 되었을 때, 패킷을 보내면 이런 문제가 일어나지 않았는데, 원하는 때, 원하는 키를 입력해서 패킷을 보내려고 하니까 문제가 일어나네요 ㅜㅜ
문제를 알 수 있을까요? 프로토 버퍼를 사용해서 주고 받고 있습니다!

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

1) DeadLock 잡는 원리를 이해했다면 거기서 로그나 breakpoint를 잡으면 어느 부분에서 꼬였는지 알 수 있으니 그 부분을 분석하시면 됩니다. 이해를 못했다면 애당초 그걸 굳이 포폴에 넣으시면 안 됩니다. 데드락은 그 정도로 자주 발생하는 치명적인 문제는 아닙니다.
2) 두번째로 질문은 하는게 아니라 스스로 답을 찾는겁니다. 자꾸 누구의 도움을 받으려고 하면 실력 향상에 도움이 안 됩니다. 초반엔 괴로워도 10시간씩 헤딩하고 그런 시간을 가져보세요. 화이팅!

마지막으로 애당초 위의 내용만으로는 저도 원인을 알 수 없습니다. 나머지 코드를 봐야 진짜 문제가 있는건지, 아니면 데드락 프로파일러 설정에 의한 문제일지 알 수 있겠죠.

가랑눈님의 프로필 이미지
가랑눈
질문자

ㅜㅜ 감사합니다 루키스님.
말씀 보고 힘이 나네요...
더 열심히 헤딩 하겠습니다! 항상 좋은 답변 감사합니다!!

가랑눈님의 프로필 이미지
가랑눈

작성한 질문수

질문하기