Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr
  • 0

델파이 12 access violation at address 관련 문의


AntKim

질문

안녕하세요 델파이 5 -> 12로 마이그레이션을 진행을 하였는데요.

델파이 5에서는 종료할 때 뜨지 않던 에러가 12에서는 종료하면 떠서 문의 드립니다.

3.PNG.a345e2b53db5d94794060a5caba8abee.PNG

위 에러가 떠서 구글 검색한 결과로 Map 파일을 만들어서 라인은 검색해봤는데 따로 안나옵니다. 이런경우는 어떻게 찾아야할까요 ?

$0052AE03 - $00401000 을 계산한 값으로 찾으면 된다고 다들 이야기 해주시는데,

위 값을 계산하면 00129E03 인데 Map 파일을 검색해도 해당 단어는 없다고 나오네요.

도움 부탁드립니다.

 

이 댓글 링크
다른 사이트에 공유하기

15 answers to this question

Recommended Posts

  • 1

내용과 관련 없을 수도 있으나, 저 같은 경우 최근 델파이5 -> 11.3 으로 업그레이드 진행 시 Access Violation 에러는

대부분 "이미 해제된 메모리에 접근 했을 때" 발생했습니다.

또 GetMem() 함수로 할당되었던 변수 해제 시 기존 5버전 String(AnsiString)과 11.3버전 String(WideString) 의 차이로,

발생한 경우도 있었네요.. 

Edited by 김민호
이 댓글 링크
다른 사이트에 공유하기

  • 0

디버그를 걸어서 확인해봤는데요. 제가 프로그램한 부분에서 에러가 나는것이 아니라, 

Vcl.Controls 부분에서 에러가 납니다. 이 부분은 어떻게 처리를 해야될까요 ?

Call stack - Treed 에서는 Vcl.Controls.TControl.SetVisible(False) 라고 뜹니다.

확인부탁드립니다. 

 

vcl.PNG

이 댓글 링크
다른 사이트에 공유하기

  • 0

종료하고 나서, SetVisible 쪽에서 에러가 나시는 거면,

폼을 닫을 때 발생하는 이벤트(FormClose, FormCloseQuery 등) 또는 주기적은로 반복하는 TImer 이벤트에, 

존재하지 않는(nil) 폼이나, 컨트롤에 대해, Visible이나, 별도 처리하는 부분을 확인해보세요.

 

딱히 없다면, 이벤트를 주석처리해보시거나, Assigned 함수를 이용해서 할당 유무를 걸어서,

테스트해보셔도 좋을 것 같습니다.

procedure FormClose(Sender : TObject)
begin
  if Assigned("컨트롤") then // "컨트롤" <> nil 은 True, "컨트롤" = nil은 False를 반환
  begin
   // 할당된 상태.
     "컨트롤".Visible := False;
  end;
end;

 

이 댓글 링크
다른 사이트에 공유하기

  • 0

존재하지 않는 폼이나 컨트롤은 확인해보았는데 따로 없습니다. 

그래서 말씀해주신 Assigned 함수를 이용하려고 

if Assigned(TControl.SetVisible) then

으로 처리를 해보았는데, Cannot access private symbol TControl.SetVisible 이라고 에러가 떨어지네요.

이 댓글 링크
다른 사이트에 공유하기

  • 0

Application.HandleException은 프로그램 내에 예외 처리가 발생할 때, 처리하는 부분입니다.

관련 내용이 정리된 글이 있어 공유드립니다.

 

참고사이트 : http://devquest.co.kr/impboard/impboard.dll?action=read&db=bcb_tip&no=885

이 댓글 링크
다른 사이트에 공유하기

  • 0

Assigned는 할당된 상태인지를 알려주는 함수입니다.

다음과 같이 사용하시면 됩니다.

...
Panel1 : TPanel;
...
  FreeAndNil(Panel1);

  if Assigned(Panel1) then // Panel1이 해제되었으므로, False가 전달됨.
  begin
    // Panel1 존재
  end
  else
  begin
    // Panel1 존재X
  end;

참고 사이트 : https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Assigned

또한, Timer나, 폼을 닫을 떄 처리하는 부분이 없는데, 프로그램을 종료할 떄, 해당 에러가 발생하신다면 

특정 기능이나 이벤트가 동작할 때에만 발생하시는 건지, 또는 실행후 바로 종료해도 발생하시는 건지 확인해보시면 좋을것 같습니다.

 

Edited by Miniuser
이 댓글 링크
다른 사이트에 공유하기

  • 0

폼을 닫을 때 처리하던 부분을 전부 주석처리를 진행하여도 에러가 떠서 system 도 디버그로 따라가 보았는데,

Vcl.Form.pas 에서 여러 군데에서 에러가 나면서 여러 번의 access violation 에러가 나네요.

이 경우는 델파이 5 -> 12로 폼을 마이그레이션 하는 부분에서 form 에서 에러가 났다고 봐야할까요 ?

 

이 댓글 링크
다른 사이트에 공유하기

  • 0

Vcl.Form 에서 에러가 나는것이 Form 에서 없는 부분때문에 에러가 나는것이라면

위에서 알려주신 방법대로 하나하나 할당이 되지 않은 panel 이나 이런 것들을 찾아봐야 하겠네요 ..

그런데 refind 이용하여 동일하게 마이그레이션 진행을 하였는데 Form 에 있던게 없어지거나 할수도 있나요 ?

이 댓글 링크
다른 사이트에 공유하기

  • 0
13 분 전, 김승연 said:

Vcl.Form.pas 에서 여러 군데에서 에러가 나면서 여러 번의 access violation 에러가 나네요.

혹시 해당 프로젝트 폴더에 Vcl.Form.pas 파일이 있는지 확인해보시겠어요?

있다면, 다른 이름으로 변경하거나, 다른 곳으로 옮긴 다음, 다시 테스트해보셔야 할 것 같습니다.

 

 

이 댓글 링크
다른 사이트에 공유하기

  • 0

신규 VCL 프로젝트를 하나 만든 다음에, 실행후 종료했을때, 

동일한 오류가 나시면 재설처를 진행해보셔야 할 것 같습니다.

 

만약 신규 프로젝트에서는 오류가 나지 않는다면, 오류가 발생하는 해당 프로젝트에서 폼을 종료하는 부분 말고도,

FormCreate, FormShow 등 이벤트도 한번 주석을 걸어보고 테스트 해보셔도 좋을 것 같습니다.

즉 아무런 동작이나, 이벤트를 주지 않아도, 오류가 발생하는지 확인해봐야 할 것 같습니다.

이 댓글 링크
다른 사이트에 공유하기

  • 0

그리고 프로젝트 메뉴에서 Default style 을 바꾸는 부분에서 window 가 아닌 다른 것으로 바꾸면

프로그램 run 할 때 stack overflow 가 나네요 ... 

혹시 이게 델파이 5 -> 12로 마이그레이션을 진행하였을 때 호환성의 문제일 수도 있을까요 ?

위에 에러나는 것도 그렇고 그런 것 같아서요.

이 댓글 링크
다른 사이트에 공유하기

  • 0

몇 일 동안 계속 이리저리 작업을 하다가 어제 올려주신 김민호님의 댓글을 보고 AnsiString 으로 선언되어있던 것들을

그냥 기본 String 으로 변경하니 해당 에러가 안 뜨네요. 기존 5버전과 12버전의 차이로 인하여 해당 에러가 뜨는 것 같습니다.

기존 5버전의 String을 쓰려면 AnsiString 으로 처리를 해야 한다고 하여 String 선언된 것들을 AnsiString 으로 선언을 하였는데, 그 부분에서 문제가 생기는 것 같네요.

하나하나 String 을 AnsiString 으로 바꾸면서 찾아보기 보다는 기존 5에서 사용하던 한글의 Copy 방식을 찾아서 변경하는 부분이 더 나을 것 같네요. 

너무 예전 버전인 5에서 12로 변경을 진행하려니 AnsiString 과 WideString 의 차이점을 잘 확인해 봐야겠네요.

마이그레이션을 진행하려는 많은 분들이 제 사례가 나오면 참고하시면 좋을 것 같습니다. 

답변 주신 모든 분들 너무 감사드립니다.

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 질문에 답변하기...

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.