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에서도 해결되지 않고 있네요.
엠바 컴파일러가 코드를 최적화 해서 보여주지 못하는 거로 알고있는 사람들이 태반이던데...
디버깅 모드로 빌드하는데 무슨 최적화... 대부분 잘못 알고 있는 거죠.
본질적으로 컴파일러가 프레임 정보를 잘못 생성하거나, 제대로 생성했더라도 디버거 쪽에서 디코딩을 잘못하든가 해서
프레임 콘텍스트를 정상적으로 처리하지 못하는 문제이지... 근본적으로 최적화로 인한 문제가 아닙니다.
|
현재로썬 소스코드 디버깅이 불가능한거네요