C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[58182] Re:[질문]Access Violation 에러나 주소로 찾아서 에러난 곳을 보니
장성호 [nasilso] 1535 읽음    2009-08-25 15:40
0x005374A0   에서 access-violation이 난것이라면

실제 AccessViolation- Address =  0x005374A0    -  0x00400000 - 0x00001000 =  0x001364A0 이 되겠네요

BCB는 map파일에 모든 line번호가 나오지 않으므로 
하안인님께서 유추하신것처럼   Controls의 ScreenToClient 코드가 가장 유력할것 같습니다.

0001:00136490  __fastcall Controls::TControl::ScreenToClient(const Types::TPoint&) 

AccessViolation 주소인 0x001364A0  과 함수주소인 0x00136490 를 비교해보면 딱 0x10 (16Byte)차이가 나네요

Controls 유닛의 TControl.ScreenToClient 코드는 다음과 같습니다.
function TControl.ScreenToClient(const Point: TPoint): TPoint;
var
  Origin: TPoint;
begin
  Origin := ClientOrigin;
  Result.X := Point.X - Origin.X;
  Result.Y := Point.Y - Origin.Y;
end;



함수 시작에서 0x10 byte떨어졌다면 
Origin := ClientOrigin; 이부분에서 access-Violation이 발생한것 같습니다.


그런데 왜 저기서  access-violation이 발생할까요?
vcl소스에 문제가 있어서 그런것일까요?

다음과 같이 코딩하면 위와 똑같은 부분에서 accessviolation이 발생합니다.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TPoint pt;
    TControl *ctrl=NULL;
    pt=ctrl->ScreenToClient(pt);
}
//---------------------------------------------------------------------------


예외가 발생하는 시점이  ctrl->ScreenToClient(pt); 부분이 아니라
TControl.ScreenToClient 부분이라는 것입니다.

즉 NULL 객체의 함수를 호출해도 , 호출부분에서 예외가 발생하지 않고
함수내부에서 객체의 멤버변수에 접근하려고 할때 발생합니다.

객체가 존재하지 않아도 함수의 코드는 존재하니까요..

반대로 함수 내부에서 객체의 멤버변수(또는 property등)에 대한  접근이 없이
단순 계산만해서 return해준다면
객체를 생성하지 않아도 예외가 발생하지 않죠. 다음 코드와 같이 ..
class TMyClass: TObject
{
    public:
    int GetSum(int a,int b)
    {
        return a+b;
    }
};
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TMyClass *cls=NULL;
    int sum=cls->GetSum(10,4); //여기서 전혀 예외가 발생하지 않습니다.
    ShowMessage(IntToStr(sum));
}
//---------------------------------------------------------------------------


어딘가에서 객체를 free 또는 delete한 Control의 함수를 호출한것 같네요

ScreenToClient를 호출하는 부분을 전부 한번 살펴봐 보세요..


그럼...


하안인 님이 쓰신 글 :
: Access violation at address 005374A0 in module 'aa.exe'
: read of address 0126a028.
:
: 이란 메시지를 받아서 map파일을 만들어서  map에 있는 내용을 보니
:
:
: 0001:001363AC  __fastcall Controls::TControl::SetClientHeight(int)
:  0001:001363D4  __fastcall Controls::TControl::GetClientOrigin()
:  0001:00136464  __fastcall Controls::TControl::ClientToScreen(const Types::TPoint&)
:  0001:00136490  __fastcall Controls::TControl::ScreenToClient(const Types::TPoint&) --- 이부분에서 걸리는것 같은데 요.
:  0001:001364BC  __fastcall Controls::TControl::SendCancelMode(Controls::TControl *)
:  0001:001364EC  __fastcall Controls::TControl::SendDockNotification(unsigned int, int, int)
:  0001:00136558  __fastcall Controls::TControl::Changed()
:
:
: 위의 부분에서 걸리는 것같은데 이부분이 어디 부분인지 모르겠습니다.
:
: 어떻게 찾아야 하는지요.

+ -

관련 글 리스트
58180 [질문]Access Violation 에러나 주소로 찾아서 에러난 곳을 보니 하안인 1513 2009/08/25
58182     Re:[질문]Access Violation 에러나 주소로 찾아서 에러난 곳을 보니 장성호 1535 2009/08/25
58181     Re:[질문]Access Violation 에러나 주소로 찾아서 에러난 곳을 보니 외랑 1029 2009/08/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.