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

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[25131] Re:64비트 디버거 버그인가요
빌더(TWx) [builder] 6143 읽음    2015-05-17 12:41
bugfree 님이 쓰신 글 :
: C++ 프로젝트에서 .pas 소스파일 불러들여서
: 컴파일하면 오류없이 정상적으로 실행되는데
: F7 눌러도 파스칼 소스로 디버깅이 들어가지 않습니다
: 파스칼 소스에 브레이크 포인트 걸어놓아도 브레이크가
: 걸리지 않습니다
:
: 디벅모드로 컴파일했는데 C++소스만 디버깅되고
: 파스칼 소스는 디버깅이 안먹힙니다.
:
: 64비트 XE8 디버거 버그인가요?
:
: 32비트는 되는데 64비트는 디버깅이 안먹네요
:


64비트 C++ 프로젝트에선 clang 컴파일러가 사용되고(clang 오픈소스 컴파일러를 그대로 포팅한 bcc64 버전)
오브젝트 파일포맷으로 ELF를, 디버깅 포맷으로 DWARF 포맷을 사용합니다.

디버거가 바이너리 파일로 부터.. .debug_abbrev, .debug_frame, .debug_line 등의 DWARF 섹션들을 로드해서
DIE 정보, 소스라인 넘버등의 정보를 디코딩해서 디버거 내부에서 사용하는 자료구조를 생성하게 되죠.

64비트 C++ 프로젝트에서...
파스칼 소스는 델파이 컴파일러에 의해서 컴파일 되고... ELF 형식의 오브젝트 파일 .o 를 생성하기 위해서
컴파일된 .dcu 파일을 ELF 형식으로 변환하는 과정을 거치게 되는데... 이 멍청한 놈들이 변환과정에서
.debug_abbrev, debug_line 등의 DWARF 섹션을 아예 생성을 하지 않고 있습니다.

소스코드 어딘가에 브레이크 포인트를 걸때... DWARF 섹션들을 디코딩한 자료구조를 이용해서 소스코드 라인에 해당하는
머쉰코드의 물리적 어드레스를 알아내서 그 위치에 브레이크 코드를 써 넣어야 하는데...

델파이 컴파일러가 .debug_abbrev, debug_line 등의 DWARF 섹션을 아예 생성을 하지 않는 바람에...
머쉰 코드에 브레이크 코드가 삽입되지 못하고... 파스칼 소스레벨 디버깅이 안되고 있는 거죠.

64비트 C++ 컴파일러가 처음 나왔던 XE2에서도 이런 문제가 있었는데... XE8이 나온 지금 까지도 이를 해결할 의지가
엠바는 전혀 없나 봅니다.

버그라기 보다는... 델파이 컴파일러에서 해당 기능이 아예 구현되어 있지 않은...
짓다가 만 미완성의 집을... 새집 가격을 받고 팔고 있다고나 할까요...



엠바 디버거의 또 다른 문제는...

함수에 전달되는 파라미터나 스택변수를 디버거에서 사용할 수 있도록 하고자 할 경우..
컴파일러가 디버깅 정보로 DWARF 포맷을 사용한다면 .debug_frame 섹션을 생성해 주고, 디버거가 이 정보를 이용하면
레지스터가 사용되는 경우에도 파라미터나 스택변수를 보여 줄 수 있게 됩니다.

호출방식으로 __fastcall 방식이 사용되어(델파이에서 사용되는 호출방식) 레지스터가 사용되더라도...
DWARF 프레임 정보를 이용해서 스택변수나 파라미터를 보여줄 수 있는 건데.. 엠바 디버거는 프레임 컨텍스트를 제대로 처리하지
못하고 있습니다.

파라미터, 스택변수를 보여주지 못하거나 정상적이 아닌 이상한 값으로 보여주는 문제는 .. XE8에서도 해결되지 않고 있네요.

엠바 컴파일러가 코드를 최적화 해서 보여주지 못하는 거로 알고있는 사람들이 태반이던데...
디버깅 모드로 빌드하는데 무슨 최적화... 대부분 잘못 알고 있는 거죠.

본질적으로 컴파일러가 프레임 정보를 잘못 생성하거나, 제대로 생성했더라도 디버거 쪽에서 디코딩을 잘못하든가 해서
프레임 콘텍스트를 정상적으로 처리하지 못하는 문제이지... 근본적으로 최적화로 인한 문제가 아닙니다.







bugfree [bugfree]   2015-05-18 16:01 X
그럼 엠바카데로에서 손을 쓰지않는 이상
현재로썬 소스코드 디버깅이 불가능한거네요
bugfree [bugfree]   2015-05-19 07:07 X
나오는건 한숨만 ㅡ.ㅡ
빌더(TWx) [builder]   2015-05-20 17:33 X
불가능한 건 아니죠.

64비트 .dcu 파일구조가 OMF도 ELF도 아닌 구조지만, 내부에서 다루는 디버깅 포맷이 옛날에 사용됐던 OMF를 변종한 구조라서 분석하기가 쉽고, ELF와 DWARF포맷구조만 알고있으면 .dcu 파일로 부터 디버깅 정보를 추출하고 DWARF 포맷구조를 생성해서 ELF 오브젝트 파일을 생성해주면 되니까 어려운 일은 아니죠. ELF, DWARF 포맷은 오픈아키텍쳐라 공식문서를 쉽게 찾을 수 있을 겁니다.

ELF, DWARF 포맷을 모르고 있다면.. 먼저 이것 부터 스타디 해보세요. 64비트 .dcu 디버깅 포맷은 분석해본 경험이 있어서 도와드릴 수 있습니다.

bugfree [bugfree]   2015-05-20 23:53 X
시스템 프로그래밍 로우레벨에 빠삭하지 않으면 어렵겠군요
빌더님은 가능하시겠지만 저는 ELF, DWARF가 있다는거만
들어봐서요. 문서보구 배워봐야게습니다
bugfree [bugfree]   2015-05-20 23:58 X
궁금한게 있는데요
디버거가 어떻게 파라미터와 스텍변수 값을 알아낼수 있나요
레지스터가 사용되면 알아낼 방법이 없을거 같은데요
bugfree [bugfree]   2015-05-24 10:35 X
dwarf 문서 보구있는데요 로우레벨이라 상당히 어렵고
debug_abbrev 이 어떤 의미인지도 모르겠네요 ㅡ.ㅡ

+ -

관련 글 리스트
25129 64비트 디버거 버그인가요 bugfree 5246 2015/05/12
25131     Re:64비트 디버거 버그인가요 빌더(TWx) 6143 2015/05/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.