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

정성태

... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
13038정성태4/26/202213468오류 유형: 806. twine 실행 시 ConfigParser.ParsingError: File contains parsing errors: /root/.pypirc
13037정성태4/25/202214248.NET Framework: 1998. Azure Functions를 사용한 간단한 실습
13036정성태4/24/202215202.NET Framework: 1997. C# - nano 시간을 가져오는 방법 [2]
13035정성태4/22/202216463Windows: 204. Windows 10부터 바뀐 QueryPerformanceFrequency, QueryPerformanceCounter
13034정성태4/21/202214035.NET Framework: 1996. C# XingAPI - 주식 종목에 따른 PBR, PER, ROE, ROA 구하는 방법(t3320, t8430 예제)파일 다운로드1
13033정성태4/18/202215151.NET Framework: 1195. C# - Thread.Yield와 Thread.Sleep(0)의 차이점(?)
13032정성태4/17/202215351오류 유형: 805. Github의 50MB 파일 크기 제한 - warning: GH001: Large files detected. You may want to try Git Large File Storage
13031정성태4/15/202215026.NET Framework: 1194. C# - IdealProcessor와 ProcessorAffinity의 차이점
13030정성태4/15/202213570오류 유형: 804. 정규 표현식 오류 - Quantifier {x,y} following nothing.
13029정성태4/14/202214960Windows: 203. iisreset 후에도 이전에 설정한 전역 환경 변수가 w3wp.exe에 적용되는 문제
13028정성태4/13/202215086.NET Framework: 1193. (appsettings.json처럼) web.config의 Debug/Release에 따른 설정 적용
13027정성태4/12/202214958.NET Framework: 1192. C# - 환경 변수의 변화를 알리는 WM_SETTINGCHANGE Win32 메시지 사용법파일 다운로드1
13026정성태4/11/202216331.NET Framework: 1191. C 언어로 작성된 FFmpeg Examples의 C# 포팅 전체 소스 코드 [3]
13025정성태4/11/202215592.NET Framework: 1190. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 vaapi_encode.c, vaapi_transcode.c 예제 포팅
13024정성태4/7/202213851.NET Framework: 1189. C# - 런타임 환경에 따라 달라진 AppDomain.GetCurrentThreadId 메서드
13023정성태4/6/202214432.NET Framework: 1188. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 transcoding.c 예제 포팅 [3]
13022정성태3/31/202214000Windows: 202. 윈도우 11 업그레이드 - "PC Health Check"를 통과했지만 여전히 업그레이드가 안 되는 경우 해결책
13021정성태3/31/202215801Windows: 201. Windows - INF 파일을 이용한 장치 제거 방법
13020정성태3/30/202214033.NET Framework: 1187. RDP 접속 시 WPF UserControl의 Unloaded 이벤트 발생파일 다운로드1
13019정성태3/30/202214498.NET Framework: 1186. Win32 Message를 Code로부터 메시지 이름 자체를 텍스트로 구하고 싶다면?파일 다운로드1
13018정성태3/29/202215248.NET Framework: 1185. C# - Unsafe.AsPointer가 반환한 포인터는 pinning 상태일까요? [5]
13017정성태3/28/202214235.NET Framework: 1184. C# - GC Heap에 위치한 참조 개체의 주소를 알아내는 방법 - 두 번째 이야기 [3]
13016정성태3/27/202215873.NET Framework: 1183. C# 11에 추가된 ref 필드의 (우회) 구현 방법파일 다운로드1
13015정성태3/26/202217584.NET Framework: 1182. C# 11 - ref struct에 ref 필드를 허용 [1]
13014정성태3/23/202215039VC++: 155. CComPtr/CComQIPtr과 Conformance mode 옵션의 충돌 [1]
13013정성태3/22/202212821개발 환경 구성: 641. WSL 우분투 인스턴스에 파이썬 2.7 개발 환경 구성하는 방법
... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...