메모리 위치를 관찰하거나 코드에서 '데이터 중단점'을 설치하시겠습니까?

StackOverflow https://stackoverflow.com/questions/1689019

문제

메모리 덮어쓰기 문제가 있습니다.프로그램이 진행되는 동안 어느 시점에서 메모리 위치를 덮어쓰게 되어 프로그램이 충돌하게 됩니다.문제는 릴리스 모드에서만 발생합니다.디버그 중에는 모든 것이 정상입니다.이는 고전적인 C/C++ 버그이며 찾기가 매우 어렵습니다.

이 메모리 위치를 감시하고 변경되면 콜백을 호출하는 '디버깅 코드'를 추가하는 방법이 있는지 궁금했습니다.이는 기본적으로 디버거가 디버그 모드('데이터 중단점')에서 수행할 수 있는 작업이지만 릴리스에서도 비슷한 기능이 필요합니다.

도움이 되었습니까?

해결책

변수의 위치를 ​​제어할 수 있는 경우 이를 전용 페이지에 할당하고 다음을 사용하여 읽기만 허용하도록 페이지 권한을 설정할 수 있습니다. VirtualProtect (윈도우에서는...Linux에서는 확실하지 않습니다.)

이렇게 하면 누군가가 여기에 쓰려고 할 때 액세스 위반이 발생하게 됩니다.예외 변환기 기능을 사용하면 이를 콜백으로 처리할 수 있습니다.

변수를 직접 이동할 수 없더라도(예:클래스 멤버임) 변수 주위에 충분한 패딩을 추가하여 해당 변수가 전용 페이지에 있는지 확인하고 동일한 접근 방식을 사용할 수 있습니다.

다른 팁

"릴리스"코드에 대한 디버그 기호를 계속 생성 할 수 있습니다. 이것은 "디버그"모드에서와 마찬가지로 디버거를 통해 여전히 실행될 수 있습니다.

나는 최근에 릴리스 드라이버 중 하나와 비슷한 일을하여 Vtune을 통해 실행할 수있었습니다. microsfot 링크의 경우 추가했습니다 -DEBUG Microsoft CC의 경우 플래그를 추가했습니다 -Zi. 모든 것이 잘 작동합니다. MSKB 링크

당신은 이것을 찾을 수 있습니다 링크 유용한.

Windows를 사용하고 있다고 가정하면 WindBG를 사용하여 프로그램을 디버깅하고 BA 명령을 확인하십시오. 메모리에 액세스 할 때이 문제가 발생합니다.

이를위한 도구가 있습니다 - 힙 에이전트 및 Boundschecker 및 덮어 쓰기를 발견 할 많은 다른 많은 것들이 있습니다. 기본적으로 메모리 할당 끝에 센티넬이 필요하며 확인해야합니다.

디버깅 API는 플랫폼 별이지만 존재합니다. 그리고 유닉스 API는 온라인으로 찾을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top