2013-08-16 5 views
0

MSVS 2010에서 프로젝트를 디버깅하려고합니다. 구현 - C++; 내가 소스 코드 degubbing 오전, 나는 MSVS에 의해보고 된 다음과 같은 오류가 발생합니다.액세스 voilation 독서 위치

실패보고 :

"First chance exception at 0x00000013fb5b9ee in unit.exe: 0xc00000005 access voilation reading location 0x00000000000000c." 

문제가 주소를 얻기에있다. 폴 (C1)에 연결된 송신기 핀 모듈이다 - :

int base = (*(abc::g_runc1.m_paulsenderpin.m_lastchunk_p)).xcpp::cxcppoutput::m_baseaddress; 

내 프로젝트는 소스 코드 단편에서

이 같이 표현을 포함하는 매우 크다. - xcpp는 인터페이스

이 소스 코드와 프로젝트는 정확하며 ARM 컴파일러에서는 오류없이 작동하지만 MSVS에서는 액세스 위반 오류가 발생합니다. msdn에는 어셈블리에 의해 설정된 사용 권한에 관한 게시물이 있으며 주소가 지정된 위치를 읽지 않습니다. 그렇다면 그것을 바꾸는 방법 ...? 또는 문제를 찾는 데 더 좋은 옵션이 있습니까?

도움을 주시면 감사하겠습니다.

+0

'abc :: g_runc1.m_paulsenderpin.m_lastchunk_p '란 무엇입니까? 어떻게 선언됩니까? 그것이 포인터라면, 그것이 'NULL'이 아닌지 확인합니까? –

+0

abc :: g_runc1.m_paulsenderpin.m_lastchunk_p = 0x00000000000 paulsenderpin 구조체 {pinbase, m_currentchunk, m_lastchunk, ....}. 메모리는 송신자 핀, 메모리 블록 1024 바이트에 대해 폴에 할당됩니다. 그 외에도 폴, 폴리, 라울 등 8 개의 핀이 있습니다 ..... 폴을 제외한 모든 플랫폼의베이스 주소는 같은 방식으로 해제되며 메모리 음성 오류가 없습니다. 오직 paul만이 어디서나이 문제를 가지고 있습니다. 및 MSVS가 예외를 throw하지만 ARM에서는 예외가 발생합니다. –

+0

0 일 경우 NULL이라는 의미이며 일반적으로 불법 주소입니다. –

답변

0

문제는 MSB 바이트가 손실되어 올바른 메모리 주소를 찾을 수 없기 때문에 ARM 디버거 32 비트 및 MSVS10 48 비트 주소 지정에서 메모리 주소 지정과 관련이 있습니다.

0

코드가 실제로 프로세스의 소유가 아닌 위치에 액세스하려고합니다. 사용자 응용 프로그램의 데이터는 0에 가깝게 위치 할 수 없습니다. 표현식이 너무 길어서 제로 참조를 포함하는 멤버가 어디 있는지 찾을 수 없기 때문에 팁은 m_last chunk_p이고 m_baseaddress은 오프셋 12의 멤버 인 것으로 보입니다.

간단한 설명이 있는데 왜 코드가 제대로 작동합니까? ARM과 함께 작동하는 것으로 컴파일됩니다. ARM은 정렬 된 메모리 액세스를 사용하므로 클래스 및 구조 멤버는 전체 블록에 할당되지만 전체 블록은 할당 된 전체 공간을 사용하지는 않습니다. 따라서 더 큰 포인터 또는 잘못된 memset 매개 변수를 코드의 어딘가에 사용하면 포인터가 덮어 쓰기됩니다.

기본 유형의 크기가 항상 같지 않으므로 다른 버전의 컴파일러 (또는 다른 프로세서 아키텍처 32/64가 아닌 다른 시스템)로 컴파일 할 때 문제가 사라질 수도 있습니다.

표현식에서 실제로 뾰족한 점 (실제로는 12 점)을 확인하고 그것에 시계를 설정해야합니다. sizeof을 어디에서나 올바르게 사용해야합니다.

+0

초기화시, m_lastchunk = 0x00000000; 이고 전혀 변경되지 않으므로 처리되지 않은 예외가 발생합니다. 이 오류는 함수의 실제 작업 이전의 아주 초기 단계입니다. 간신히 init에 있습니다. –

+0

그래서 값을 설정하는 것을 잊어 버렸기 때문에 잘못된 것이 없습니다. 두 가지 옵션이 있습니다. 액세스하기 전에 해당 멤버를 초기화 할 수 있습니다. 또는 액세스 권한이 있고 이미 할당되지 않은 경우에만 '스마트 프록시'를 사용하여 데이터를 할당 할 수 있습니다. – user35443

+0

우선 초기화를 시도했지만, 먼저 작동하지 않으며 소스 코드는 ARM/MSVS 용 일반 소스 코드 여야합니다. 그리고 난 구조대를 사용하고 생성 된 이러한 소스 코드에서 정의로, 핀, c1과 xcpp에 대한 소스를 변경하는 제약이 있습니다. MSVS는 다른 대안을 제공합니까? ...? 나는 그것의 바보를 안다. 그러나 제약 때문에 나는 수정의 범위를 제한했다. –