2016-06-20 2 views
-3

나는 freepascal의 돈 관리 프로그램을 오랫동안 사용해 왔으며 최근에는 몇 가지 제한 사항을 해결하기 위해 포인터를 사용하기 시작했습니다. 그것은 90 %의 시간 동안 잘 동작합니다. 임의의 시간에 발생하는 것으로 보이는 EAccessViolation을 디버깅하려고합니다. 나는 모든 포인터를 확인했다. 어디에나 할당되었거나, 액세스되었거나 해방되었다.pchar에 메모리를 할당하려고 시도 할 때의 액세스 위반

필자는 마침내 항상 "책임있는"코드의 일부를 추적하고 추적 한 상황을 발견했습니다. 이는 약 2000 자 (chars) 정도되는 ansistring을 만드는 기능입니다. 나는 그것을 pchar로 바꾸었고 stralloc과 함께 524 개 이상의 char을 할당하려 할 때 액세스 위반이 발생한다는 것을 깨달았다. 524 자 미만인 한 원하는만큼 pchar을 할당 할 수 있습니다.

누군가가 읽기/쓰기를 시도하지 않고 액세스 위반을받을 수있는 아이디어가 있다면 그럴 것입니다. 그것은 내게 지적되었습니다. 이것은 힙 손상입니다.

동일한 컴퓨터에서 다른 버전의 내 OS (우분투 10, lubuntu 14)에서 같은 프로그램을 실행하려고 시도했습니다. 하지만 다른 컴퓨터를 사용하여, lubuntu 14, 그것은 잘 작동하는 것 같습니다. 더 많은 테스트를 통해 문제가 OS 나 컴퓨터에서 어떤 문제가 발생하지만 프로그램을 실행하는 터미널의 크기가 특정 값보다 큰 경우에는 발생하지 않는다는 것을 알았습니다. CRT의 기능에 액세스하는 장치에서 포인터를 사용하지 않더라도 CRT 장치와 더 구체적으로 "창"기능을 사용하는 데 문제가있을 수 있습니까? 나는 그것을 조사하고있다. ...

그것은 틀린 기억 일 수 있었느냐? memtest86이 오류를 반환하지 않았습니다 ... 아니오

주셔서 감사합니다.

어려운 문제에 대한
+1

[help/on-topic] : * 디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 질문 자체. 분명한 문제 성명이없는 질문은 다른 독자에게 유용하지 않습니다. 참고 : [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve) * –

+1

하드웨어에 결함이있는 것 같습니까? 당신은 더 많은 의심이 필요합니다. 자신의 능력에 회의주의 태도를 기르십시오. 문제가 귀하의 코드에 있습니다. 당신 만이 그것을 볼 수 있습니다. 행운을 빕니다. –

+0

@Ken White, 나는 그것이 특정한 문제라고 느낀다. 아마도 충분히 설명하지 못했을 것이다. 내가 이해 한 바에 따르면, 액세스 위반의 근원은 프로그램의 어디에서나 (포인터가 단위 화되고, 해제 된 후 액세스 될 수 있기 때문에) 포함하지 않았기 때문에 코드에서 실행되는 코드의 일부는 아닙니다. 위반이 발생하는 순간, 내 프로그램은 여러 단위로 5000 줄이 넘습니다. 내 질문은 어떻게이 코드를 사용하여 액세스 위반을 생성 할 수 있습니다 :'p : = stralloc (2000);'; p는 pchar이고 stralloc는 freepascal rtl의 문자열 단위의 함수입니다. – paiiburn

답변

0

자료 무료 파스칼 디버그 절차 :

  • 가 (당신이 다른 소스에서 t 년대의 다른 번호를 볼 수 있습니다 -gtt와 -CRriot
  • 독 지역 변수와 모든 런타임 검사를 사용하도록 설정하는 것이 단지 패턴)
  • (리눅스, FreeBSD의)에 컴파일하는 경우, -gv 컴파일 및 Valgrind의

를 통해 실행하고 아니, 아마 그냥 프로그래밍 오류가 변경됩니다.

관련 문제