본문 바로가기

프로그래밍 오류해결

엑세스 위반이란?


코딩을 하다가 발생한 문제중 이러한 내용을 만나서 난감하던 순간에, 네이버 지식인에 괜찮은 글이있어서 소개 한다.


Thread.exe의 0x7c94b1fa에 처리되지 않은 예외가 있습니다. 0xC0000005: 0x00000010 위치를 기록하는 동안 액세스 위반이 발생했습니다.



<네이버지식인에 theuhm 님의 답글 내용입니다>
http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&eid=WP6P1UoocaevAs0HJKUR+wOiZxz/DChG&qb=MHhDMDAwMDAwNTogMHgwMDAwMDAxMCDsnITsuZjrpbwg6riw66Gd7ZWY64qUIOuPmeyViCDslaHshLjsiqQg7JyE67CY7J20IOuwnOyDne2WiOyKteuLiOuLpC4=&enc=utf8&pid=fl5o4woi5TGsstM8OaNsss--060012&sid=SgJnYxFQAkoAAEtzK9I

엑세스 위반(Access Violation)은, 프로세스가 접근할 권한이 없는 메모리 영역에 접근하고자 했을 때 발생합니다. 

윈도우는 메모리의 모든 영역을 가상메모리 페이지 단위로 관리하는데, 이 메모리 영역마다 접근 권한을 설정합니다. 이 권한은 프로세스가 가진 속성별로 관리됩니다. 크게 사용자가 만든 사용자 프로세스와, 윈도우 시스템에서 돌리는 커널 프로세스로 구분할 수 있죠. 윈도우에서 관리하는 메모리는 커널에서만 읽고 쓸수 있는 영억, 커널에서만 읽을 수 있는 영억,  사용자프로세스에서도 읽을 수 있는 영역, 사용자 프로세스가 읽고 쓸 수 있는 영역 등으로, 가상메모리 페이지에 권한이 설정되어 있습니다.

따라서 적절한 권한이 없는 프로세스가 제한된 메모리 영역에 읽고 쓰기를 시도할 때 엑세스 위반이 발생합니다. 대표적인 예로 "0xC0000005: 0x00000000 위치를 기록하는 동안 엑세스 위반이 발생했습니다"라는 예외는 0x00000000 번지, 즉 널 포인터에 대하여 쓰기를 시도했다는 뜻이죠. 0x00000000번지로 시작하는 메모리 영역은 유저 프로세스에 대해서는 읽기/쓰기가 금지된 영역입니다. 시스템 운영에 중요한 정보가 기록되어 있기 때문이죠. 따라서 사용자가 만든 프로그램이 이 위치를 접근하고자 하는 것은 이와 같은 에러를 냅니다.

에러 메시지에서, "decoding.exe의 0x00413f9d에 처리되지 않은 예외가 있습니다. 0xC0000005: 0x00000000 위치를 기록하는 동안 액세스 위반이 발생했습니다."의 0x00413f9d는, 0x00000000위치를 접근하고자 하는 명령이 수행된, 명령이 저장된 번지수입니다. 디버깅할 때 해당 번지수의 명령이 무엇인가를 살펴보면 비교적 헤메지 않고 버그를 잡을 수 있습니다.