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
[74736] Re:Re:Re: 64비트 c0nt64.nasm 소스레벨 디버깅 가능하게 하기
빌더(TWx) [builder] 3762 읽음    2018-01-15 01:08
기영테크 님이 쓰신 글 :
: 답변 감사합니다
:
: 말씀해주신대로 nasm 어셈블러 소스코드 다운받아 보고있는데요
:
: 제가 어지간한 소스코드는 분석할 수 있을 정도로 공부가 되어있다고 자부하고 있었는데
:
: 어떻게 손을 대야할지 눈 앞이 캄캄합니다.
:
:
:
: 그래도 프로그래밍 경력 20년이 넘는데 지금까지 헛 배웠나봐요. 흑흑
:
: dwarf 문서도 다운 받아보았는데 내용 이해하기도 힘드네요. 흑흑
:
:


답변:


dwarf 포맷이 Compile Unit을 루트로 해서 DIE 정보들이 sibling/child 관계를 가지면서 트리 구조로 생성된다는 것.

소스레벨 디버깅을 위해 파일명과 라인넘버를 그대로 처리하면 프로젝트가 클 경우 디버깅 정보가 매우 커지므로
컴파일러는 일종의 스테이트 머쉰 코드를 이용해서 디버깅 소스라인 정보를 축약해서 생성해야하고

디버거는 축약되어 있는 소스라인 정보를 뽑아내기 위해 스테이트 머쉰 코드를 디코딩하는 인터프리터를 구현하고 있어야 한다는 것.

이런 내용을 파악하고 있지 않으면 dwarf 포맷을 이해하기가 복잡하기는 합니다만...

nasm 어셈블러 프로그램 소스코드가 복잡한가요?
clang/llvm 컴파일러 툴 체인 소스에 비하면 상당히 간단한 편인데요.

nasm 어셈블러 프로그램 소스가 템플릿을 이용한 C++ OOP 로 구현되어 있었다면
분석하기가 훨씬 편했을 텐데 너덜한 플레인 C로 구현되어 있어서 지져분 하기는 합니다.

혹자는 OOP 개념 사용하지 않고 단순하게 절차적 프로그래밍으로 코딩 하는 게 낫다고 철부지 같은 소리를 하기도 하던데
OOP개념이 손에 녹아있지 않아서 하는 투정이겠지요.

템플릿을 이용한 C++ OOP 구조에 폴리모피즘을 입혀서 코딩하게 되면, 처리해야 할 자료구조가 복잡할 때 위력을 발휘하게 되죠.



RAD Studio 10.2.2 가 설치되어 있는 디렉토리가...
C:/Program Files (x86)/Embarcadero/Studio/19.0 라고 전제하고 시작합니다.


첨부한 c0x64.o 파일을
C:/Program Files (x86)/Embarcadero/Studio/19.0/lib/win64/debug 이나
C:/Program Files (x86)/Embarcadero/Studio/19.0/lib/win64/release 디렉토리에 넣어 둡니다.

그전에 오리지날 c0x64.o 파일은 _c0x64.o 등으로 리네임 해서 백업 받아 놓고요.


64비트 C++ 컴파일 환경에선 c0nt64.nasm 어셈블러 파일이 콘솔모드, GUI, DLL, 패키지 등의
런타임 Start-up 코드로 사용됩니다. 조건부 컴파일로 타겟에 따라 오브젝트만 다른 이름으로 생성하는 거 이외에는
의미가 없으므로 콘솔모드 프로그램을 예로 들어 보겠습니다.


1.
아래와 같이 C++ Builder 프로젝트로 Console Application 을 선택한다.






2.
타겟을 설정하고...




3.
플렛폼을 64비트로 선택




4.
C:/Program Files (x86)/Embarcadero/Studio/19.0/source/cpprtl/Source/startup 디렉토리에서
아래와 같이 c0nt64.nasm 소스파일을 IDE에 끌어 놓고, 라인넘버 236번 줄에 브레이크 포인트를 건다.
int3 브레이크 인스트럭션을 메뉴얼로 사용하지 않고 cont64.nasm 수정 없이 소스파일에 브레이크 포인트를 걸면 됩니다.

이 부분이 Start-up 엔트리죠.






5.

F9 를 누르면 c0nt64.nasm 236번 라인에서 브레이크가 걸리면서 어셈블러 소스레벨 디버깅이 가능해 집니다.




이전에 올린 답변에서 언급했듯이 C++ 소스와 같이 전체적으로 소스레벨 디버깅이 가능하도록 하려면
엠바 64비트 C++ 컴파일러, 링커, 디버거를 해킹해서, 엠바 애들이 사용하는 Internal 정보를 분석해서
어느 부분에서 sanity 체크가 걸리는지 알아내야 합니다.

+ -

관련 글 리스트
74728 컴파일러 고수 분. RAD 10.2 64비트 디버거 버그인가요? 기영테크 3275 2018/01/12
74731     Re:컴파일러 고수 분. RAD 10.2 64비트 디버거 버그인가요? 빌더(TWx) 3344 2018/01/12
74732         Re:Re:컴파일러 고수 분. RAD 10.2 64비트 디버거 버그인가요? 기영테크 3288 2018/01/13
74736             Re:Re:Re: 64비트 c0nt64.nasm 소스레벨 디버깅 가능하게 하기 빌더(TWx) 3762 2018/01/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.