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

정성태

... 91  92  93  94  95  96  97  [98]  99  100  101  102  103  104  105  ...
NoWriterDateCnt.TitleFile(s)
11483정성태4/10/201827888개발 환경 구성: 358. "Let's Encrypt"에서 제공하는 무료 SSL 인증서를 IIS에 적용하는 방법 (2) [1]
11482정성태4/10/201820366VC++: 126. CUDA Core 수를 알아내는 방법
11481정성태4/10/201831991개발 환경 구성: 357. CUDA의 인덱싱 관련 용어 - blockIdx, threadIdx, blockDim, gridDim
11480정성태4/9/201822008.NET Framework: 736. C# - API를 사용해 Azure에 접근하는 방법 [2]파일 다운로드1
11479정성태4/9/201817692.NET Framework: 735. Azure - PowerShell로 Access control(IAM)에 새로운 계정 만드는 방법
11478정성태11/8/201919908디버깅 기술: 115. windbg - 덤프 파일로부터 PID와 환경변수 등의 정보를 구하는 방법 [1]
11477정성태4/8/201817397오류 유형: 460. windbg - sos 명령어 수행 시 c0000006 오류 발생
11476정성태4/8/201818913디버깅 기술: 114. windbg - !threads 출력 결과로부터 닷넷 관리 스레드(System.Threading.Thread) 객체를 구하는 방법
11475정성태3/28/201821176디버깅 기술: 113. windbg - Thread.Suspend 호출 시 응용 프로그램 hang 현상에 대한 덤프 분석
11474정성태3/27/201819329오류 유형: 459. xperf: error: TEST.Event: Invalid flags. (0x3ec).
11473정성태3/22/201824534.NET Framework: 734. C# - Thread.Suspend 호출 시 응용 프로그램 hang 현상파일 다운로드2
11472정성태3/22/201818486개발 환경 구성: 356. GTX 1070, GTX 960, GT 640M의 cudaGetDeviceProperties 출력 결과
11471정성태3/20/201821897VC++: 125. CUDA로 작성한 RGB2RGBA 성능 [1]파일 다운로드1
11470정성태3/20/201823904오류 유형: 458. Visual Studio - CUDA 프로젝트 빌드 시 오류 C1189, expression must have a constant value
11469정성태3/19/201816904오류 유형: 457. error MSB3103: Invalid Resx file. Could not load file or assembly 'System.Windows.Forms, ...' or one of its dependencies.
11468정성태3/19/201816465오류 유형: 456. 닷넷 응용 프로그램 실행 시 0x80131401 예외 발생
11467정성태3/19/201815993오류 유형: 455. Visual Studio Installer - 업데이트 실패
11466정성태3/18/201817084개발 환경 구성: 355. 한 대의 PC에서 2개 이상의 DirectX 게임을 실행하는 방법
11463정성태3/15/201819516.NET Framework: 733. 스레드 간의 read/write 시에도 lock이 필요 없는 경우파일 다운로드1
11462정성태3/14/201822338개발 환경 구성: 354. HTTPS 호출에 대한 TLS 설정 확인하는 방법 [1]
11461정성태3/13/201824934오류 유형: 454. 윈도우 업데이트 설치 오류 - 0x800705b4 [1]
11460정성태3/13/201817415디버깅 기술: 112. windbg - 닷넷 메모리 덤프에서 전역 객체의 내용을 조사하는 방법
11459정성태3/13/201818209오류 유형: 453. Debug Diagnostic Tool에서 mscordacwks.dll을 찾지 못하는 문제
11458정성태2/21/201819257오류 유형: 452. This share requires the obsolete SMB1 protocol, which is unsafe and could expose your system to attack. [1]
11457정성태2/17/201823959.NET Framework: 732. C# - Task.ContinueWith 설명 [1]파일 다운로드1
11456정성태2/17/201829680.NET Framework: 731. C# - await을 Task 타입이 아닌 사용자 정의 타입에 적용하는 방법 [7]파일 다운로드1
... 91  92  93  94  95  96  97  [98]  99  100  101  102  103  104  105  ...