C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[25253] RAD Seattle C++11 32Bit 컴파일러 - Exception 패치
빌더(TWx) [builder] 5959 읽음    2015-09-11 02:53
Projects.zip 23.6MB RAD 10 Seattle - 32Bit C++11 Exception 패치
//---------------------------------------------------------------------------
int fun(int a, int b)
{
    return (a / b);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    try
    {
        fun(1, 0);
    }
    catch (EDivByZero &e)
    {
        Caption = "Divide by Zero!!!..";
    }
}
//---------------------------------------------------------------------------

RAD Studio 10 Seattle, C++11 32Bit 컴파일러에서...

위와 같이 Exception 처리를 시도하면 정상적으로 실행되지 않고
프로그램이 다운되는 문제가 발생하는데... 정상 실행되도록 32비트 C++11 컴파일러 Exception 패치파일을 만들어서 올립니다.


컴파일 설정:

1. C++11 32Bit 컴파일러를 사용하도록 설정.
2. Debug 모드로 빌드할 것.
3. Dynamic Runtime 과 Package 옵션을 꺼서 static 라이브러리로 빌드할 것.
4. patchExceptionDebug.lib 를 프로젝트에서 파일을 오픈해서 같이 링크할 것.

첨부해서 올린 샘플 프로젝트 파일도 위와 같이 컴파일 옵션이 설정되어 있습니다.


런타임 라이브러리와 패키지를 static 링크로 사용하지 않으려면...
DLL(pkg) 형태의 RTL과 패키지들을 런타임 중에 후킹하는 방법을 사용해야 되는데...
이건 귀찮아서 생략 합니다.

윈도우즈10에서 해본 결과 잘 되는데... 다른 OS 환경에선 어떤지 모르겠네요...
엠바가 업데이트를 내놓을 때 까지... 한시적으로 사용하기 바랍니다.


그 아이 [tsirorret]   2015-09-11 08:39 X
빌더님은 정말 대단하시군요. 저는 다른 분야라 컴파일러 쪽은 잘 모르지만 존경합니다.
bugfree [bugfree]   2015-09-11 22:36 X
윈도7에서도 잘되네요
빌더님 너무 감사합니다
정말 대단하시네요. 저도 존경합니다^^
bugfree [bugfree]   2015-09-11 22:45 X
근데요 빌더님
gcc clang 소스 보다가 포기하고 말았는데요
예외처리에서 퍼스널러티가 뭐하는건가요
뽀뽀중 [kissjung]   2015-09-13 16:20 X
Code Guard와 디버깅 문제 패치 글은 삭제한듯 한데..
이 패치에 함꼐 포함된것인가요?
빌더(TWx) [builder]   2015-09-14 21:04 X
컴파일러에서 Exception을 구현하 방법을... 단 몇 줄의 글로 써서 설명하기는 불가능 할 것 같고요...

퍼서널러티에 대해서만 적어 봅니다.

A() 라는 함수가 try...catch 블럭을 갖고 있고...
호출 과정이 A -> B -> C -> D의 함수 순으로 이어졌고... 함수 D()에서 'CExceptionQueryError'라는 Exception 객체를 throw로
던졌다고 가정해 봅시다. 그리고 A()에서 catch(CExceptionQueryError &e) 로 예외를 받는 구조가 있다고 해 봅시다.

퍼서널러티 함수가 하는 첫번째 일은...

Exception Frame을 Unwinding하면서 해당 Exception Handler를 찾게 되는데..
이 경우에는 A()함수의 catch (CExceptionQueryError &e) {} . try...catch 블럭이 되겠죠.
빌더(TWx) [builder]   2015-09-14 21:19 X
두번째 하는 일은...

위에서 찾은 Exception Handler 지점 까지... 각 Exception Fame 별로 설정되어 있는 landing pad 코드를 실행하게 됩니다. (clean up)
그리고... Exception Context를 구성해서 해당 Exception Handler를 실행하게 됩니다. search와 clean up 단계를 2 phase로 실행하게 되는 거죠.

만약 함수 B와 C에 어떤 클래스 객체가 스택변수로 생성되어 있다면... 제어 흐름이 D()에서 A()로 바껴 버리기 때문에... 스택에 생성되어 있는
클래스 객체들의 소멸자도 호출해 주어야 하는데... 이건 clean up 단계에서 이루어지게 됩니다.

Exception Frame Unwinding 과정에서 실행되는 clean up 코드와 Exception Handler 코드를 landing pad 라고 합니다.
빌더(TWx) [builder]   2015-09-14 21:43 X
landing pad를 포함해서 Exception 객채의 type-info, try...catch 블럭의 중첩 레벨, call site 정보 등등...
여러 정보들을 컴파일러가 생성하게 되는데... 이를 LSDA라고 합니다. 표준으로 뭐가 정해져 있는 게 아니고 컴파일러 마다 다릅니다.
(Language-Specific Data Area)

퍼스널리티가 하는 역할을 요약하면 대충 이렇고요. (댓글로 적으니 앞뒤 문맥이 이상하게 꼬이네. 수정기능도 없고)


Exceip 패치코드에 Code Guard 패치코드가 같이 적용된줄 알고... 먼저 올렸던 Code Guard 패치 글은 삭제했는데 빠졌나 보네요.
작업해 놓은 Code Guard 패치코드도 다 지워버린 거 같습니다. 시간 내서(주말 쯤?) 다시 작업해서 올려 보겠습니다.
뽀뽀중 [kissjung]   2015-09-14 23:18 X
빌더님이 시간들여 하는 작업인데,,, 염치없게 요청해서 죄송 합니다.
이런 일에 신경을 써 주셔서 무척 감사하게 생각하고 있습니다.
bugfree [bugfree]   2015-09-15 13:03 X
감사합니다

+ -

관련 글 리스트
25253 RAD Seattle C++11 32Bit 컴파일러 - Exception 패치 빌더(TWx) 5959 2015/09/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.