작성
·
479
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로도 추적이 안되어서, 디버깅 할 방법을 도저히 모르겠습니다. 이렇게 빌드도 잘되고 런타임에서 오류가 발생할 때, 강사님만의 노하우가 있으신가요? 더불어서 혹시 접해보신 오류라면 조금 도와주신다면 감사하겠습니다 ㅠㅠ
혹시 몰라서 함수 콜스택도 첨부합니다.
답변 2
1
0
C++이 무서운게 크래시가 락에서 났다 그래서 락 코드가 문제라는 보장이 없습니다.
메모리 오염으로 인해 죄없는 피해자가 나타난 것일 수도 있고,
이러면 정말 찾기가 어렵고 경우에 따라 몇주씩 걸리거나
영영 못찾아서 프로젝트가 망하는 경우도 생깁니다. (흔하진 않지만 ^^;)
위 내용만으로는 저도 알 수 없고,
크래시난 위치로 보면 저 녀석이 범인일 것 같진 않고 메모리가 이미 꺠진 상황으로 보입니다.
일단 다른 환경에서도 똑같이 재현되는지 확인해보는 것이 필요할 것 같네요.
rookiss@naver.com 로 전체 프로젝트 압축해서 보내주시면,
제 컴퓨터에서도 동일한 문제가 재현되는지 확인해보겠습니다.
서비스가 참조되지 않았는데 서비스 속 session에 접근하려 해서 그랬던 거군요... 좋은 디버깅 팁 감사합니다.
덕분에 5시간의 대장정을 마칩니다. 감사합니다!