Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)

마이크로소프트의 CoreCLR 프로파일러 예제를 Visual Studio CMake로 빌드하는 방법

지난 글에서,

마이크로소프트의 CoreCLR 프로파일러 예제 빌드 방법
; https://www.sysnet.pe.kr/2/0/11294

단순히 리눅스 운영체제 상에서 CoreCLR 프로파일러를 빌드해 봤습니다. 문제는, 제가 비주얼 스튜디오의 디버깅 환경에 익숙하다는 점입니다. ^^ 그래서 다음의 경험을 살려,

Visual Studio 2019 - CMake를 이용한 공유/실행(so/out) 리눅스 프로젝트 설정
; https://www.sysnet.pe.kr/2/0/11833

프로파일러 예제를 Visual Studio CMake 프로젝트로 옮겨 봤습니다.

이를 위해 우선 coreclr과 clr-samples repo를 clone해 두어야 합니다.

E:\git_clone\coreclr
E:\git_clone\clr-samples

사실 clr-samples에서는 coreclr의 헤더 파일만 필요하기 때문에 ./coreclr 하위에 있는 다음의 폴더를,

./src/pal/inc/rt 
./src/pal/prebuilt/inc 
./src/pal/inc 
./src/inc 
./src/md/inc

"E:\git_clone\clr-samples\ProfilingAPI\ReJITEnterLeaveHooks\cor" 폴더로 복사해 둡니다. (따라서 더 이상은 e:\git_clone\coreclr 폴더가 필요 없습니다.)

그다음, "E:\git_clone\clr-samples\ProfilingAPI\ReJITEnterLeaveHooks" 경로로 이동해 해당 폴더에 다음의 내용을 담은 CMakeLists.txt를 만듭니다.

cmake_minimum_required(VERSION 3.9)
project (CorProfiler)

set (SRC_FILES ClassFactory.cpp CorProfiler.cpp dllmain.cpp ILRewriter.cpp )

add_library( CorProfiler.so SHARED ${SRC_FILES} )

이제 원래의 clang++로 빌드하는 build.sh 파일의 내용을 반영해야 하는데요.

#!/bin/sh

[ -z "${CORECLR_PATH:-}" ] && CORECLR_PATH=~/coreclr
[ -z "${BuildOS:-}"      ] && BuildOS=Linux
[ -z "${BuildArch:-}"    ] && BuildArch=x64
[ -z "${BuildType:-}"    ] && BuildType=Debug
[ -z "${Output:-}"       ] && Output=CorProfiler.so

printf '  CORECLR_PATH : %s\n' "$CORECLR_PATH"
printf '  BuildOS      : %s\n' "$BuildOS"
printf '  BuildArch    : %s\n' "$BuildArch"
printf '  BuildType    : %s\n' "$BuildType"

printf '  Building %s ... ' "$Output"

CXX_FLAGS="$CXX_FLAGS --no-undefined -Wno-invalid-noreturn -fPIC -fms-extensions -DBIT64 -DPAL_STDCPP_COMPAT -DPLATFORM_UNIX -std=c++11"
INCLUDES="-I $CORECLR_PATH/src/pal/inc/rt -I $CORECLR_PATH/src/pal/prebuilt/inc -I $CORECLR_PATH/src/pal/inc -I $CORECLR_PATH/src/inc -I$

clang++ -shared -o $Output $CXX_FLAGS $INCLUDES ClassFactory.cpp CorProfiler.cpp dllmain.cpp ILRewriter.cpp

printf 'Done.\n'

CMakefile.txt에는 다음과 같이 몇몇 환경 변수를 설정해 주고,

cmake_minimum_required(VERSION 3.9)
project (CorProfiler)

set (SRC_FILES ClassFactory.cpp CorProfiler.cpp dllmain.cpp ILRewriter.cpp)

set (ENV{BuildOS} Linux)
set (ENV{BuildArch} x64)
set (ENV{BuildType} Debug)
set (ENV{Output} CorProfiler.so)


SET ( CMAKE_CXX_FLAGS_DEBUG " -Wno-pragma-pack -Wno-undef -Wno-invalid-noreturn -fPIC -fms-extensions -DBIT64 -DPAL_STDCPP_COMPAT -DPLATFORM_UNIX -std=c++11" )
SET ( CMAKE_CXX_FLAGS_RELEASE " -Wno-pragma-pack -Wno-undef -Wno-invalid-noreturn -fPIC -fms-extensions -DBIT64 -DPAL_STDCPP_COMPAT -DPLATFORM_UNIX -std=c++11" )

INCLUDE_DIRECTORIES ( ./cor/src/pal/inc/rt ./cor/src/pal/prebuilt/inc ./cor/src/pal/inc ./cor/src/inc )

add_library( CorProfiler.so SHARED ${SRC_FILES} )

마지막으로 clang++로 변경하는 작업을 아래의 글에 따라

Visual Studio 2019 - CMake의 컴파일러를 기본 g++에서 clang++로 변경
; https://www.sysnet.pe.kr/2/0/11841

CMakeSettings.json에 설정하면 됩니다.

(첨부한 프로젝트는 그렇게 구성한 것입니다. 첨부 파일로 CMake 빌드를 하고 싶다면 CMakeSettings.json의 remoteMachineName 인증 정보만 적절하게 구성하면 ReJITEnterLeaveHooks 프로젝트를 바로 빌드할 수 있습니다.)




그런데 아쉽게도, CMake로 변경한 당초의 취지에 맞지 않게 이 프로젝트에 대한 F5 디버깅을 할 수가 없습니다. 해보면 다음과 같은 식의 오류 메시지 창이 뜨는데요.

Unable to start debugging. The startup project could not be launched.

그러니까, so 공유 모듈이기 때문에 디버깅을 위해 원격 리눅스 머신의 시작 프로세스를 지정할 수 있어야 하지만 비주얼 스튜디오의 CMake 환경에서는 이게 안 되는 것입니다. ^^; 툴 바에 보면 "Select Startup Item..."이 있는 걸로 봐서 지원을 할 수도 있을 것 같은데... 암튼 제가 그 방법을 모르겠습니다. 음... 그러니까 일단 CMake 프로젝트로는 비주얼 스튜디오 상에서 CLR Profiler 같은 식의 공유 프로젝트를 F5 디버깅할 수는 없습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 5/3/2019]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2019-03-26 12시12분
마이크로소프트의 CoreCLR 프로파일러 리눅스 예제를 Visual Studio F5 원격 디버깅하는 방법
; http://www.sysnet.pe.kr/2/0/11856

정성태

1  2  3  4  5  6  7  8  9  [10]  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13378정성태6/22/20233174오류 유형: 868. docker - build 시 "CANCELED ..." 뜨는 문제
13377정성태6/22/20237004오류 유형: 867. 파이썬 mysqlclient 2.2.x 설치 시 "Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually" 오류
13376정성태6/21/20233374.NET Framework: 2129. C# - Polly를 이용한 클라이언트 측의 요청 재시도파일 다운로드1
13375정성태6/20/20233057스크립트: 50. Transformers (신경망 언어모델 라이브러리) 강좌 - 2장 코드 실행 결과
13374정성태6/20/20233170오류 유형: 866. 파이썬 - <class 'AttributeError'> module 'flask.json' has no attribute 'JSONEncoder'
13373정성태6/19/20234463오류 유형: 865. 파이썬 - pymssql 설치 관련 오류 정리
13372정성태6/15/20233176개발 환경 구성: 682. SQL Server TLS 통신을 위해 사용되는 키 길이 확인 방법
13371정성태6/15/20233206개발 환경 구성: 681. openssl - 인증서 버전(V1 / V3)
13370정성태6/14/20233354개발 환경 구성: 680. C# - Ubuntu + Microsoft.Data.SqlClient + SQL Server 2008 R2 연결 방법 - TLS 1.2 지원
13369정성태6/13/20233175개발 환경 구성: 679. PyCharm(을 비롯해 JetBrains에 속한 여타) IDE에서 내부 Window들의 탭이 없어진 경우
13368정성태6/13/20233321개발 환경 구성: 678. openssl로 생성한 인증서를 SQL Server의 암호화 인증서로 설정하는 방법
13367정성태6/10/20233428오류 유형: 864. openssl로 만든 pfx 인증서를 Windows Server 2016 이하에서 등록 시 "The password you entered is incorrect" 오류 발생
13366정성태6/10/20233197.NET Framework: 2128. C# - 윈도우 시스템에서 지원하는 암호화 목록(Cipher Suites) 나열파일 다운로드1
13365정성태6/8/20232941오류 유형: 863. MODIFY FILE encountered operating system error 112(failed to retrieve text for this error. Reason: 15105)
13364정성태6/8/20233749.NET Framework: 2127. C# - Ubuntu + Microsoft.Data.SqlClient + SQL Server 2008 R2 연결 방법 [1]
13363정성태6/7/20233321스크립트: 49. 파이썬 - "Transformers (신경망 언어모델 라이브러리) 강좌" - 1장 2절 코드 실행 결과
13362정성태6/1/20233241.NET Framework: 2126. C# - 서버 측의 요청 제어 (Microsoft.AspNetCore.RateLimiting)파일 다운로드1
13361정성태5/31/20233697오류 유형: 862. Facebook - ASP.NET/WebClient 사용 시 graph.facebook.com/me 호출에 대해 403 Forbidden 오류
13360정성태5/31/20233065오류 유형: 861. WSL/docker - failed to start shim: start failed: io.containerd.runc.v2: create new shim socket
13359정성태5/19/20233398오류 유형: 860. Docker Desktop - k8s 초기화 무한 반복한다면?
13358정성태5/17/20233708.NET Framework: 2125. C# - Semantic Kernel의 Semantic Memory 사용 예제 [1]파일 다운로드1
13357정성태5/16/20233516.NET Framework: 2124. C# - Semantic Kernel의 Planner 사용 예제파일 다운로드1
13356정성태5/15/20233830DDK: 10. Device Driver 테스트 설치 관련 오류 (Code 37, Code 31) 및 인증서 관련 정리
13355정성태5/12/20233757.NET Framework: 2123. C# - Semantic Kernel의 ChatGPT 대화 구현 [1]파일 다운로드1
13354정성태5/12/20234013.NET Framework: 2122. C# - "Use Unicode UTF-8 for worldwide language support" 설정을 한 경우, 한글 입력이 '\0' 문자로 처리
13352정성태5/12/20233651.NET Framework: 2121. C# - Semantic Kernel의 대화 문맥 유지파일 다운로드1
1  2  3  4  5  6  7  8  9  [10]  11  12  13  14  15  ...