힙에 객체 묶음이있는 평범하지 않은 소프트웨어 프로젝트를 디버깅하고 있습니다. 어떤 시점에서 (적어도) 이러한 객체 중 하나가 손상됩니다.힙에 손상된 객체 디버깅
내 클래스에 const 회원을 추가하여 카나리아 역할을하고 실제로는 실행 중에 손상됩니다. 일반적으로 메모리에 기록 할 시점을 알아 내기 위해이 변수에 감시 점을 추가합니다. 그러나 어떤 인스턴스가 덮어 쓰여지는지 알지 못합니다. 클래스에 저장된 정보도 손상됩니다.
각 개체에 감시 점을 설정할 개체가 너무 많아서 더 작은 입력 집합으로 재생할 수 없었습니다. valgrind를 실행하는 중 "4 크기의 유효하지 않은 읽기"가 표시되는데 이는 4 바이트의 카나리아 int를 읽었지만이 시점에서는 이미 너무 늦었습니다.
여기에서 진행하는 방법에 대한 제안 사항이 있으십니까?
제목 (. 나는 초기화되지 않은 값이
-Wuninitialized
와 컴파일러에 의해 검출 될 수 있지만, 분명히 그 소리의 내 버전 (사과)-Wall
활성화로 언급처럼 느끼지 않았다 알고있다). 질문 : "스택에". 너의 마음을 위로 해주세요. – molbdnilo손상이 발생하기 전에 일부 객체가 삭제 되었습니까? '크기 4의 유효하지 않은 읽기'는 해제 된 메모리 나 할당 된 메모리 블록 외부와 같이해서는 안되는 데이터를 읽음을 의미합니다. valgrind 님이 더 자세한 정보를 제공하지 않습니까? 전체 valgrind 추적을 게시 할 수 있습니까? – Tryum
소스 코드를 검토하십시오. 그러한 부패가 발생할 수있는 원인은 무엇입니까? 프로그램이 멀티 스레드되고 적절한 동기화가 사용되지 않았습니까? 이러한 개체에 대한 포인터가 공유되고 소유자 중 하나가 다른 소유자에게 알리지 않고 메모리를 할당 해제했을 수 있습니까? 등등. – PaulMcKenzie