본문 바로가기

ns3

[ns3] SIGSEGV 에러 해결 (segmentation fault)

 

실험하면서 진짜 자주보는 에러...

아직도 초보인가봐 ㅎ

원인은 당연히 메모리 접근을 잘못한건데,

문제는 큰 실험을 돌리다보니 어디서 이게 뜬건지조차 찾는게 오래 걸린다.

 

내 경험적 통계상 많은 원인은 map이나 vector 사용할 때이다.

나중에 다시 이 에러를 만났을때를 위해 정리해둔다..^^

 

case 1)

map이나 vector에서 []사용해서 인덱스로 값 참조하는 경우보단 .at을 사용하는게 안전한데, 

문제는 at의 경우 반드시 해당 자리에 값이 존재하는 경우에만 사용가능하다. 

따라서 사용 전 자동 생성이나 초기화 과정이 반드시 필요하다.

 

case 2)

c++보다 ns3에서 발생하는 조금 더 구체적인 상황이다.

나는 시뮬레이션에서 node를 구분하는 기준으로 node Id를 사용한다. (node별로 unique한 값이라 identify하기 가장 좋은 요소같아서?)

그리고 ns3 시뮬레이션에서는 node 생성 순서에 따라 id가 0부터 순차 할당된다.

현재 나는, user > epc core entity (sgw, pgw, mme, remote host) > base station > external server 순서로 생성한다.

따라서 BS의 ID는 user number + 4(core device) 이후부터 할당인데, 이를 바탕으로 전반적인 코드를 작성했다

근데 문제는, mmWaveEnbNetDevice에서는 기지국 번호를 1부터 새로 시작해서 관리한다는 것

예를들어 ueDevice가 연결된 enbdevice object를 가져오고, 거기서 Get Cell Id 함수를 통해 해당 기지국의 번호를 가져오는데, 여기서는 GetNodeId의 번호가 아닌 기지국들간의 자체 넘버링 기반 숫자를 반환한다.

그냥 생각했을땐 이게 왜 헷갈리나 싶지만 은근히 node id 기반으로 코드를 짜다보면 이걸 잊고, 왜 sigsegv 에러가 뜨는지 고민하게 되더라...