는이 코드로 크래시 덤프가 있습니다하위 명령으로 인해 잘못된 포인터가 읽힐 수 있습니다.
mov r11,rsp
push rdi
sub rsp,0A0h
mov qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh
그것은 함수의 프롤로그입니다. 따라서 !analyze -v
은 sub
과 함께 INVALID_POINTER_READ
라고 말합니다. AMD 명령어 세트는 인수가 메모리 포인터가 아니면 sub
명령어가 예외를 생성 할 수 없다고 말합니다.
또한 READ_ADDRESS
이 ffffffffffffffff
이지만, 레지스터 창에서 나는 rsp
이 12b3e0
임을 알 수 있습니다. 그리고 이것은 64 비트 OS에서 32 비트 응용 프로그램입니다.
이 오류의 가능한 원인과 해결 방법에 대해 알고 싶습니다.
는UPD :
방법은 마이크로 소프트 비주얼 스튜디오 9.0 \ VC \에서 std._Tree.insert (const를 VALUE_TYPE & _Val)이다는 \ xtree을 포함한다.
컴파일러는 Visual Studio 2008 설치의 cl.exe, 32 비트, 버전 15.00.30729.01입니다.
명령 행 :
/FD /EHsc /MD /GS- /Zc:wchar_t- /Yu"stdafx.h"/W3 /WX /nologo /c /Zi /TP /wd4250 /FI -Zm200 -MP -w34100 -w34189
링커는 같은 소스 버전 9.00.30729.01에서입니다.
UPD : 64 비트 디버거가있는 32 비트 응용 프로그램 디버깅에 회의적인 시각을 가진 사용자를 위해 32 비트 버전의 디버거를 실행하고 동일한 결과를 얻었습니다. 그래서 나는 여전히 그것이 sub
지시라고 생각합니다.
UPD : 응용 프로그램은 32 비트 플랫폼 용으로 제작되었습니다. 그러나 프로세서 및 운영 시스템은 64 비트입니다. 따라서 덤프에서 32 비트 값을 가진 64 비트 레지스터를 볼 수 있다는 것은 이상한 일이 아닙니다.
DEP? 또는 디버거의 가짜 정보. –
당신은 확실히 실패한'sub'입니까? RIP가 실패한 명령어 다음을 가르치고 싶지는 않습니다 ...? – cHao
David, EXCEPTION_PARAMETER1은 0으로 DEP가 아닙니다. – cassandrad