메모리 위치를 관찰하거나 코드에서 '데이터 중단점'을 설치하시겠습니까?
-
18-09-2019 - |
문제
메모리 덮어쓰기 문제가 있습니다.프로그램이 진행되는 동안 어느 시점에서 메모리 위치를 덮어쓰게 되어 프로그램이 충돌하게 됩니다.문제는 릴리스 모드에서만 발생합니다.디버그 중에는 모든 것이 정상입니다.이는 고전적인 C/C++ 버그이며 찾기가 매우 어렵습니다.
이 메모리 위치를 감시하고 변경되면 콜백을 호출하는 '디버깅 코드'를 추가하는 방법이 있는지 궁금했습니다.이는 기본적으로 디버거가 디버그 모드('데이터 중단점')에서 수행할 수 있는 작업이지만 릴리스에서도 비슷한 기능이 필요합니다.
해결책
변수의 위치를 제어할 수 있는 경우 이를 전용 페이지에 할당하고 다음을 사용하여 읽기만 허용하도록 페이지 권한을 설정할 수 있습니다. VirtualProtect (윈도우에서는...Linux에서는 확실하지 않습니다.)
이렇게 하면 누군가가 여기에 쓰려고 할 때 액세스 위반이 발생하게 됩니다.예외 변환기 기능을 사용하면 이를 콜백으로 처리할 수 있습니다.
변수를 직접 이동할 수 없더라도(예:클래스 멤버임) 변수 주위에 충분한 패딩을 추가하여 해당 변수가 전용 페이지에 있는지 확인하고 동일한 접근 방식을 사용할 수 있습니다.
다른 팁
Windows를 사용하고 있다고 가정하면 WindBG를 사용하여 프로그램을 디버깅하고 BA 명령을 확인하십시오. 메모리에 액세스 할 때이 문제가 발생합니다.
이를위한 도구가 있습니다 - 힙 에이전트 및 Boundschecker 및 덮어 쓰기를 발견 할 많은 다른 많은 것들이 있습니다. 기본적으로 메모리 할당 끝에 센티넬이 필요하며 확인해야합니다.