none
"전역변수" 장시간 memcpy()사용시 데이터 유실, memcpy() 복사 전후 데이터 다른 오류 RRS feed

  • 질문

  • Server : HPE DL360 Gen9 8SFF CTO Server

    OS: MS Windows Server Standard 2016 DSP

    Tool : VisualStudio 2015 C++ MFC

    질문 : 아래와 같이 전역변수 사용시 데이터가 유실되는 메모리오류 사례가 있는지 궁금합니다. 문제점을 찾아서 동작은 되지만

    이와 비슷한 메모리 할당 버그가 OS나 개발툴에서 나타나고 있는지 답변 부탁 드립니다.

    1.전역변수 사용 문제점 : "전역변수 메모리" 할당 후 memcpy()를 오랜시간(40시간 이내) 반복 동작시 전역변수 메모리의 데이터의 일부분이 전혀다른 값으로 채워지는 현상이 발견됨 프로그램 재시작 할때까지 계속 유지되는 오류.

    이상한 부분은 동일한 Server 3대중 1대는 40시간이내 오류가 발생되며 1대는 약 1주일간격 1대는 전혀 발생 안함.

    2.지역변수 비교시험결과

    같은 데이터를 "지역변수 메모리"로 할당 후 memcpy()를 오랜시간 반복 동작시에는 정상데이터가 유지됨. 

    3. memcpy(A,B,size) 사용하여 메모리 복사후 A , B데이터 비교결과 데이터가 틀린 부분이 발견됨 

    • 이동됨 Dong Hee Kim 2019년 7월 10일 수요일 오전 1:31
    2019년 7월 10일 수요일 오전 1:23

모든 응답

  • 그런 경우, 거의 99%는 자신의 소스 코드에 문제가 있는 것입니다.

    지역 변수로 할당 후 문제가 해결되었다면 다중 스레드에서 해당 메모리를 동시에 접근하는 것이 아닌지 체크할 필요가 있습니다.

    그 외에 memcpy는 A와 B가 같은 버퍼의 다른 위치를 복사는 경우, 한 때 겹침 문제로 인한 오동작이 발생할 수 있었습니다. 근래의 VC++ Runtime에서는 해당 문제가 없도록 바뀌었다고 하는데, 2015라면 가능성이 없지는 않을 것입니다. 확인해 보시고,  그런 경우라면 memmove를 사용해야 합니다.

    2019년 7월 10일 수요일 오전 3:55
  • 답변 감사합니다.

    추가로 설명 좀 드리겠습니다.

    현재 서버 3대는 각각 독립적으로 작동하고 있습니다.
    탑재된 프로그램은 CPU사용률이 5%이하인 아주 간단한 프로그램인데요
    같은SW를 3대에 각각 설치하여 동작시키면

    1번장비는 오류발생이 없으며,
    2번장비는 1주일쯤 동작하다가 오류발생,
    3번장비는 3일이내에서 비주기로 발생하고 있습니다.

    ////////////////////////////////////////////////////////////

    전역변수 구조체 A 할당
    전역변수 구조체 B 할당
    문제점을 찾다가 발견된 내용중에서는 개발툴에서 memcpy(A,B,size)를 사용후 A데이터와 B데이터가 다른값이 존재 하는오류가 발생된것이 확인 되었습니다.
    (오류 예시첨부)
    memcpy() A = 511    B = 32002
    memcpy() A = 0       B = 3841
    memcpy() A = 22273 B = 27390
    memcpy() A = -2304 B = -12543
    A,B변수는 연산중에 다른곳에서 절대 덮어쓰거나 연산 또는 참조되지 않는 변수입니다.
    연산전에 항상 초기화도 하며 단순 구조체B 에서 구조체A로 복사하는데 생기는 버그입니다.

    해결방안을 찾다가 전역변수A지역변수A로 변경후 memcpy(A,B,size)를 사용후 데이터 비교 결과 40시간 이내 발견되던 오류는 한달동안 오류가 발생 안되고 있습니다.
    지역변수 구조체 A 할당
    전역변수 구조체 B 할당

    관련된 메모리 복사,메모리할당 또는 OS,나 개발툴에 관련된 오류 보고서를 찾고있는데 링크좀 부탁 드립니다.

    2019년 7월 12일 금요일 오전 1:55