inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Session #1

Atomic<uint32> _lockFlag의 load 함수 호출 시 읽기 액세스 위반

538

hobbyhyoin

작성한 질문수 2

0

강사님 안녕하세요. 정말 좋은 강의 잘 듣고 있습니다 ㅎㅎ 감사합니다.

다름이 아니라 지금까지 저 스스로 코드를 써나가며 강의를 복기하고 있는데, 이번 시간 진도 이후로 갑자기 문제가 없었던 LockBased Memory Allocator 부분에 문제가 생겼습니다.

디버깅으로 함수 콜 스택을 추적해보니, Lock::WriteLock 함수에 쓰레드 자기 자신이 WRITE_LOCK을 가지고 있는지 확인하는

const uint32 lockThreadId = (_lockFlag.load() & WRITE_THREAD_MASK) >> 16;

에서 예외(읽기 액세스 위반)이 발생했고, 더 적은 쓰레드 환경(주 쓰레드 + 함수 실행 쓰레드 1개)에서도 예외가 발생했습니다. 

 

atomic header에서

_NODISCARD _TVal load() const noexcept { // load with sequential consistency

        const auto _Mem = _Atomic_address_as<int>(_Storage);

        auto _As_bytes  = __iso_volatile_load32(_Mem);

        _Compiler_or_memory_barrier();

        return reinterpret_cast<_TVal&>(_As_bytes);

    }

_Mem이 0x18였다는 이유로 예외가 throw되었습니다.

Atomic 타입의 멤버 변수로부터 오류가 생긴다는 거 부터가 당황스럽고, 구글링해도 결과가 안나오고,
Stompallocator로도 추적이 안되어서, 디버깅 할 방법을 도저히 모르겠습니다. 이렇게 빌드도 잘되고 런타임에서 오류가 발생할 때, 강사님만의 노하우가 있으신가요? 더불어서 혹시 접해보신 오류라면 조금 도와주신다면 감사하겠습니다 ㅠㅠ

 

혹시 몰라서 함수 콜스택도 첨부합니다.

windows-server MMORPG network

답변 2

1

Rookiss


보다 보니 단순한 NULL 크래시였습니다.
요런 버그는 크래시 난 지점에 수상한 코드가 없다면,
콜스택을 타고 가면서 NULL이 아닌지 확인이 필요합니다.

0

hobbyhyoin

서비스가 참조되지 않았는데 서비스 속 session에 접근하려 해서 그랬던 거군요... 좋은 디버깅 팁 감사합니다.

덕분에 5시간의 대장정을 마칩니다. 감사합니다!

0

Rookiss

C++이 무서운게 크래시가 락에서 났다 그래서 락 코드가 문제라는 보장이 없습니다.
메모리 오염으로 인해 죄없는 피해자가 나타난 것일 수도 있고,
이러면 정말 찾기가 어렵고 경우에 따라 몇주씩 걸리거나
영영 못찾아서 프로젝트가 망하는 경우도 생깁니다. (흔하진 않지만 ^^;)

위 내용만으로는 저도 알 수 없고,
크래시난 위치로 보면 저 녀석이 범인일 것 같진 않고 메모리가 이미 꺠진 상황으로 보입니다.
일단 다른 환경에서도 똑같이 재현되는지 확인해보는 것이 필요할 것 같네요.
rookiss@naver.com 로 전체 프로젝트 압축해서 보내주시면,
제 컴퓨터에서도 동일한 문제가 재현되는지 확인해보겠습니다.

0

hobbyhyoin

지금 바로 보내겠습니다. 감사합니다!

writeLock을 잡을때 꼭 empty 상태여야하는 이유?

0

63

2

Memory Pool에서 오버플로우 질문입니다.

0

94

2

포토폴리오 및 진로 관련하여 고민입니다.

0

167

1

포토폴리오 관련 고민입니다.

0

90

1

실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.

0

107

2

성능 테스트 결과

0

117

2

게임 서버 Stateful, Stateless 진로 고민

0

143

1

WaitOnAddress와 Sleep의 차이 질문

0

97

1

궁금한거 있습니다.

0

92

2

JobTimer 구동 스레드

0

116

2

TryPop() 동작 관련 질문

0

86

1

로드맵 C#서버 C++서버 방향성 질문

0

162

2

스레드 id를 출력할떄 메인스레드 id도 출력되나요?

0

80

1

생명주기를 위한 의도적 복사

0

94

2

락프리의 실무에서 사용 질문

0

154

2

32bit threadID와 16비트 상위 WriteFlag에 대해

0

109

2

mutex와 sleep 차이점

0

133

1

실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다

0

167

2

Stomp Allocator의 Release함수에 대한 질문입니다.

0

101

1

공부법 관련해서

0

189

2

MakeShared 함수 관련

0

118

1

지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.

0

152

2

운영체제관련 질문입니다

0

143

1

send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.

0

125

2