문제

도와주세요! 나는 정말로 내 재치가 끝났다. 내 프로그램은 작은 개인 노트 관리자입니다 ( "Cintanotes"의 Google). 일부 컴퓨터에서는 (물론 그 중 어느 것도 소유하지 않습니다) 시작 직후에 예외가없는 예외로 충돌합니다. AMD CPU가있는 경향이 있다는 점을 제외하고는 이러한 컴퓨터에 대해 특별한 말을 할 수 없습니다.

환경 : Windows XP, Visual C ++ 2005/2008, Raw Winapi.

다음은 "Heisenbug"에 대한 확실한 점입니다.

1) 충돌은 릴리스 버전에서만 발생합니다.

2) 모든 GDI 관련 물건을 제거하자마자 충돌이 사라집니다.

3) BoundChecker는 불만이 없습니다.

4) 로그를 작성하면 로컬 int 변수의 선언에서 충돌이 발생 함을 보여줍니다! 어떻게 될 수 있습니까? 기억 부패?

어떤 아이디어라도 대단히 감사하겠습니다!

업데이트 : "결함"PC에서 앱을 디버깅 할 수있었습니다. 결과 :

"Cintanotes.exe에서 0x0044A26A에서 예외를 처리하지 않은 예외 : 0xc000001D : 불법 교육."

코드가 끊어집니다

0044A26A CVTSI2SD XMM1, DWORD PTR [ESP+14H

따라서 문제는 "코드 생성/활성화 강화 명령 세트"컴파일러 옵션에있는 것 같습니다. "/Arch : SSE2"로 설정되었으며 SSE2를 지원하지 않는 기계에서 충돌하고있었습니다. 이 옵션을 "설정하지 않음"으로 설정하고 버그가 사라졌습니다. 휴!

도움을 주셔서 대단히 감사합니다 !!

도움이 되었습니까?

해결책

구성이 디버그 구성 일 때 충돌하지 않습니까? 릴리스 구성과 다른 많은 것들이 있습니다. 1.) Globals의 초기화 2.) 실제 기계 코드가 생성 된 등 ..

따라서 첫 번째 단계는 디버그 모드와 비교하여 릴리스 모드의 각 매개 변수에 대한 정확한 설정이 무엇인지 알아내는 것입니다.

-기원 후

다른 팁

4) Writig A Log는 로컬 int 변수의 선언에서 충돌이 발생 함을 보여줍니다! 어떻게 될 수 있습니까? 기억 부패?

실행 파일 / 어셈블리의 기본 코드는 무엇입니까? INT 선언은 전혀 코드가 아니므로 충돌 할 수 없습니다. 어떻게 든 INT를 초기화합니까?

충돌이 발생한 코드를 보려면 사후 분석이라고하는 것을 수행해야합니다.

Windows 오류보고

충돌을 분석하려면 충돌 덤프가 있어야합니다. 이를위한 한 가지 옵션은 Windows 오류보고에 등록하는 것입니다. 약간의 돈 (디지털 코드 서명 ID가 필요함)과 일부 양식 작성이 필요합니다. 더 많은 방문 https://winqual.microsoft.com/ .

고객으로부터 직접 wer를 위해 충돌 덤프를 얻으십시오.

또 다른 옵션은 충돌을 겪고있는 일부 사용자와 직접 충돌 덤프를받는 사람을 접하는 것입니다. 사용자는 충돌을 Microsoft로 보내기 전에 기술 세부 정보를 클릭하면이를 수행 할 수 있습니다. 충돌 덤프 파일 위치를 확인할 수 있습니다.

자신의 미니 럼프

또 다른 옵션은 자신의 예외 핸들러를 등록하고 예외를 처리하고 원하는 곳에 미니 덤프를 작성하는 것입니다. 자세한 설명은 다음에서 찾을 수 있습니다 Code Project Mindumps 및 Visual Studio .NET 기사로 응용 프로그램 디버깅.

1) 충돌은 릴리스 버전에서만 발생합니다.

그것은 일반적으로 보장되지는 않지만 디버그 빌드에서 사실이라는 일부 행동에 의존한다는 신호입니다. 예를 들어, 변수를 초기화하는 것을 잊거나 한계에서 배열에 액세스하는 것을 잊어 버린 경우. 모든 컴파일러 검사 (/rtcsuc)를 켜야합니다. 또한 기능 매개 변수 평가 순서 (보장되지 않음)에 의존하는 것과 같은 것을 확인하십시오.

2) 모든 GDI 관련 물건을 제거하자마자 충돌이 사라집니다.

어쩌면 그것은 당신이 GDI 관련 작업에 뭔가 잘못하고 있다는 힌트일까요? 예를 들어 해방 된 후 손잡이를 사용하고 있습니까?

다운로드 Windows 용 도구 디버깅 도구 패키지. 기호 경로를 올바르게 설정 한 다음 WindBG에서 응용 프로그램을 실행하십시오. 어느 시점에서 액세스 위반으로 중단됩니다. 그런 다음 "! Analyze -v"명령을 실행해야합니다. 이는 상당히 똑똑하고 무엇이 잘못되고 있는지에 대한 힌트를 주어야합니다.

대부분의 heisenbugs / 릴리스 전용 버그는 초기화되지 않은 메모리 / 부실 포인터 / 버퍼의 끝 또는 경주 조건 또는 둘 다의 판독에 의존하는 제어 흐름에 기인합니다.

할당 할 때 메모리를 제로화하도록 할당자를 재정의 해보십시오. 문제가 사라지는가 (또는 더 재현 가능합니까?)

Writig A Log는 로컬 int 변수의 선언에서 충돌이 발생 함을 보여줍니다! 어떻게 될 수 있습니까? 기억 부패?

스택 오버플로! ;)

4) Writig A Log는 로컬 int 변수의 선언에서 충돌이 발생한다는 것을 보여줍니다! 어떻게 될 수 있습니까? 기억 부패

나는 부러진 자의 수많은 "이상한 충돌"의 원인을 발견했습니다. this 상기 객체의 멤버 기능 내부.

사고는 무엇을 말합니까? 액세스 위반? 예외 ? 그것은 이것을 해결할 더 많은 단서가 될 것입니다

PageHeap.exe를 사용하여 메모리 손상이 미리 미치지 않도록하십시오

스택 오버플로가 없도록하십시오 (CBIG 배열 [10000000]).

초기화되지 않은 메모리가 없는지 확인하십시오.

또한 프로세스에 대한 디버그 기호 (디버그 버전 생성과 동일하지 않음)를 생성 한 후에도 디버거 내부에서 릴리스 버전을 실행할 수 있습니다. 디버거 추적 창에서 경고를 받고 있는지 확인하십시오.

"4) 로그를 작성하는 것은 로컬 int 변수의 선언에서 충돌이 발생한다는 것을 보여줍니다! 어떻게 될 수 있습니까? 메모리 부패?"

이것은 하드웨어에 실제로 결함이 있거나 너무 세게 밀려 있다는 신호일 수 있습니다. 그들이 컴퓨터를 오버 클럭했는지 알아보십시오.

이 유형의 물건을 얻을 때, 나는 바운드 체커에 대한 다양한 클래스의 오류를 확인하므로 Gimpels PC-Lint (정적 코드 분석)를 통해 코드를 실행하려고합니다. BoundSchecker를 사용하는 경우 메모리 중독 옵션을 켭니다.

AMD CPU를 언급합니다. 충돌하는 기계에 유사한 그래픽 카드 / 드라이버 버전 및 / 또는 구성이 있는지 여부를 조사 했습니까? 이 기계에 항상 충돌합니까, 아니면 가끔씩 충돌합니까? 이 기계에서 시스템 정보 도구를 실행하고 공통점이 무엇인지 확인하십시오.

나에게 스택 부패처럼 들린다. 내가 추적하는 내가 가장 좋아하는 도구는입니다 아이다 프로. 물론 사용자의 컴퓨터에 액세스 할 수 없습니다.

일부 메모리 체커는 스택 손상을 포착하는 데 어려움을 겪습니다 (실제로는 그렇다면). 내가 생각하는 가장 확실한 방법은 런타임 분석입니다.

예외가 처리 되더라도 예외 경로에서의 부패로 인한 것일 수도 있습니다. 'Catch First-Chance Extrections'를 켜는 것을 디버깅합니까? 당신은 가능한 한 오래되어야합니다. 많은 경우에 잠시 후에 성가시다.

해당 사용자가 확인 된 신청서 버전을 보낼 수 있습니까? 체크 아웃 미니 덤프 그 예외를 처리하고 덤프를 작성하십시오. 그런 다음 사용하십시오 Windbg 당신의 끝을 디버깅하기 위해.

또 다른 방법은 매우 상세한 로그를 작성하는 것입니다. "모든 단일 작업 로그"옵션을 작성하고 사용자에게 켜고 보내도록 요청하십시오. 메모리를 로그에 덤프하십시오. msdn에서 '_crtdbgreport ()'를 확인하십시오.

행운을 빕니다!

편집하다:

귀하의 의견에 응답 : 로컬 변수 선언의 오류는 나에게 놀라운 일이 아닙니다. 나는 이것을 많이 보았다. 일반적으로 손상된 스택 때문입니다.

예를 들어 스택의 일부 변수가 경계를 통해 실행 중일 수 있습니다. 그 후 모든 지옥이 느슨해집니다. 그런 다음 변수 선언을 스택으로 무작위 메모리 오류를 던지고 가상 테이블이 손상됩니다.

나는 그것들을 장기간 보았을 때마다, 나는 Ida Pro에 가야했다. 자세한 런타임 분해 디버깅 내가 아는 유일한 것은 실제로 그것을 안정적으로 얻는 것입니다.

많은 개발자들이 이러한 종류의 분석에 WindBG를 사용합니다. 그래서 Minidump도 제안했습니다.

합리적 (IBM) PurifyPlus를 사용해보십시오. BoundSchecker가하지 않는 많은 오류가 발생합니다.

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