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

마이크로소프트의 CoreCLR 프로파일러 리눅스 예제를 Visual Studio F5 원격 디버깅하는 방법

CoreCLR 프로파일러 예제를 리눅스 운영체제에서 빌드해 보고,

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

이것을 Visual Studio의 CMake 프로젝트로 변경도 해봤는데요.

마이크로소프트의 CoreCLR 프로파일러 예제를 Visual Studio CMake로 빌드하는 방법
; https://www.sysnet.pe.kr/2/0/11842

F5 디버깅이 안 된다는 것은 차라리 리눅스에서 개발하는 것이 나을 정도이므로 별로 효용성이 없습니다. 하지만, 이 프로젝트를 비주얼 스튜디오의 리눅스 프로젝트로 변경하면,

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

F5 디버깅이 가능합니다. 변경 과정도 그다지 어렵지 않습니다. 그냥 리눅스 프로젝트 생성 후 위의 글에 설명한 데로 so 프로젝트로 변경하고 빌드에 필요한 dotnet core include 파일들을 포함하면 됩니다. include 파일들은 vcxproj 파일에 다음과 같은 식으로 일괄 포함하는 것도 가능하지만,

<ItemGroup>
    <ClInclude Include=".\cor\**\*.h" />
</ItemGroup>

일일이 추가해도 상관없습니다. 그다음 리눅스 측에서 빌드할 때 cor 폴더의 header 파일들을 찾을 수 있도록 "C/C++" / "General"의 "Additional Include Directories"에 다음의 4개 폴더를 등록합니다.

./cor/src/inc
./cor/src/pal/inc/rt
./cor/src/pal/inc
./cor/src/pal/prebuilt/inc

실제로 dotnet core 헤더 파일들에는 하위 폴더들이 많은데 프로파일러 예제 빌드로는 저 4개의 폴더만 있으면 됩니다. 그리고 "C/C++" / "Preprocessor"의 "Preprocessor Definitions"에 "BIT64;PAL_STDCPP_COMPAT;PLATFORM_UNIX" 매크로 상수도 추가한 후 경고를 없애기 위해 "C/C++" / "Command Line"의 "Additional Options"에 다음의 옵션도 넣어줍니다.

-Wno-undef -Wno-invalid-noreturn -fms-extensions -Wno-conversion -Wno-pragma-pack -Wno-unused-variable

마지막으로, "C/C++" / "General"의 "C++ Compiler"를 clang++로 변경하면 끝!

(첨부 파일은 이렇게 변경한 프로젝트 파일입니다.)




그럼 F5 디버깅을 해봐야 할 텐데요. 이를 위해 /etc/profile에 CORECLR 관련 환경 변수를 등록하든가,

$ sudo nano /etc/profile
 
export CORECLR_PROFILER={cf0d821e-299b-5307-a3d8-b283c03916dd}
export CORECLR_ENABLE_PROFILING=1
export CORECLR_PROFILER_PATH=~/projects/corprofiler/bin/x64/Debug/libcorprofiler.so

$ sudo source /etc/profile

아니면 프로젝트 속성 창의 "Debugging"에 "Pre-Launch Command"로 다음과 같이 환경 변수를 등록하면 됩니다.

export CORECLR_ENABLE_PROFILING=1; export CORECLR_PROFILER={cf0d821e-299b-5307-a3d8-b283c03916dd};export CORECLR_PROFILER_PATH=libcorprofiler.so;

(위에서는 CORECLR_PROFILER_PATH에 경로를 생략했는데 이렇게 하려면 /etc/ld.so.conf에 경로를 등록해야 합니다.)

그다음 실행 파일을 /usr/bin/dotnet으로, 인자로 닷넷 예제 프로젝트의 빌드된 DLL을 주면,

Program: /usr/bin/dotnet
Program Arguments: webapp.dll
Working Directory: ~/coreapp

이후 비주얼 스튜디오에서 F5 키를 눌러 원격 디버깅을 진행할 수 있습니다. 오~~~ 이제야 개발할 맛이 납니다. ^^




참고로, 기본 프로파일러 예제는 의존성이 많은데요,

$ ldd ~/projects/corprofiler/bin/x64/Debug/libcorprofiler.so
        linux-vdso.so.1 (0x00007ffda3b38000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa7b5cda000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa7b5ac2000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa7b56d1000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa7b5333000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa7b627b000)

다음의 글에 따라 어느 정도 줄이는 것이 가능합니다.

Linux 응용 프로그램의 (C++) so 의존성 줄이기(ReleaseMinDependency)
; https://www.sysnet.pe.kr/2/0/11845

export된 symbol을 보면 재미있는 점이 있는데요.

$ nm ~/projects/corprofiler/bin/x64/Debug/libcorprofiler.so
0000000000011380 V CLSID_CLR_v1_MetaData
0000000000011390 V CLSID_CLR_v2_MetaData
0000000000011470 V CLSID_Cor
0000000000011480 V CLSID_CorMetaDataDispenser
0000000000011490 V CLSID_CorMetaDataDispenserReg
0000000000011330 V CLSID_CorMetaDataDispenserRuntime
00000000000114a0 V CLSID_CorMetaDataReg
0000000000217008 d DW.ref.__gxx_personality_v0
000000000000e410 T DecoderGetOnDiskSize
000000000000e290 T DecoderInit
000000000000e240 T DllCanUnloadNow
000000000000e170 T DllGetClassObject
0000000000217018 D EnterMethodAddress
000000000001419c r GCC_except_table1
...[생략]...

저렇게 윈도우에서의 프로파일러와 유사한 COM 접근 방식을 리눅스에서도 그대로 흉내 내고 있습니다. ^^ 실제로 소스코드를 봐도 vtable 기반 하의 COM 접근 방식을 동일하게 구현하고 있습니다.




dotnet core의 헤더 파일들을 모두 포함시키면 다음과 같은 식의 빌드 오류가 발생할 수 있습니다.

1>  Task "MultiToolTask" skipped, due to false condition; ('%(Midl.ExcludedFromBuild)'!='true' and '$(UseMultiToolTask)' == 'true') was evaluated as (''!='true' and '' == 'true').
1>  Using "MIDL" task from assembly "C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\MSBuild\Microsoft\VC\v160\Microsoft.Build.CppTasks.Common.dll".
1>  Task "MIDL"
1>    midl.exe  cor\src\inc\clrdata.idl
1>    Tracking command:
1>    C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\MSBuild\Current\Bin\Tracker.exe /d "C:\Program Files (x86)\MSBuild\15.0\FileTracker\FileTracker32.dll" /r C:\BUILD_VS_CLR_SAMPLES\CORPROFILER\CORPROFILER\COR\SRC\INC\CLRDATA.IDL /b MSBuildConsole_CancelEvent9ebc403f3abc41d38c14e3110ec31c70  /c midl.exe   cor\src\inc\clrdata.idl
1>    TRACKER : error TRK0005: Failed to locate: "midl.exe". The system cannot find the file specified.
1>

왜냐하면, 포함된 폴더에는 헤더 파일뿐만 아니라 idl, rc, cpp 등의 파일도 있기 때문인데요, 따라서 그 파일들은 빌드에서 제외해야 합니다.




리눅스 프로젝트 빌드 시 다음과 같은 오류가 발생한다면?

1>  C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\MSBuild\Microsoft\VC\v160\Application Type\Linux\1.0\Linux.targets(151,5): error : Current project architecture 'ARM' is incompatible with the remote system architecture 'x64' ('x64'). Please switch the project architecture to 'x64' in Configuration Manager.

현재 비주얼 스튜디오의 빌드 타겟이 ARM으로 설정되어 있기 때문입니다. x64로 바꿔주면 정상적으로 빌드가 됩니다.




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

[연관 글]






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

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

비밀번호

댓글 작성자
 



2019-05-21 03시22분
How to debug .net core 2 app on linux server via visual studio 2017 on windows? [Music no 4]
; http://tomaszjarzynski.pl/how-debug-net-core-2-app-linux-server-via-visual-studio-2017-windows-music-4/

Debugging ASP Core on Linux with Visual Studio 2017
; https://blogs.msdn.microsoft.com/premier_developer/2017/11/10/debugging-asp-core-on-linux-with-visual-studio-2017/
정성태

... 151  152  153  154  155  156  157  [158]  159  160  161  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1099정성태8/15/201128227오류 유형: 132. 어느 순간 갑자기 접속이 안 되는 TFS 서버
1098정성태8/15/201150255웹: 24. 네이버는 어떻게 로그인 처리를 할까요? [2]
1097정성태8/15/201121565.NET Framework: 235. 메서드의 메타 데이터 토큰 값으로 클래스를 찾아내는 방법
1096정성태8/15/201125690디버깅 기술: 42. Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석 - (2)
1095정성태8/14/201126139디버깅 기술: 41. Windbg - 비정상 종료된 닷넷 프로그램의 StackTrace에서 보이는 offset 값 의미
1094정성태8/14/201130531오류 유형: 131. Fiddler가 강제 종료된 경우, 웹 사이트 방문이 안되는 현상
1093정성태7/27/201124138오류 유형: 130. Unable to connect to the Microsoft Visual Studio Remote Debugging Monitor ... Access is denied.
1092정성태7/22/201126550Team Foundation Server: 46. 코드 이외의 파일에 대해 소스 제어에서 제외시키는 방법
1091정성태7/21/201125544개발 환경 구성: 128. WP7 Emulator 실행 시 audiodg.exe의 CPU 소모율 증가 [2]
1089정성태7/18/201131118.NET Framework: 234. 왜? Button 컨트롤에는 MouseDown/MouseUp 이벤트가 발생하지 않을까요?파일 다운로드1
1088정성태7/16/201124229.NET Framework: 233. Entity Framework 4.1 - 윈도우 폰 7에서의 CodeFirst 순환 참조 문제파일 다운로드1
1087정성태7/15/201126889.NET Framework: 232. Entity Framework 4.1 - CodeFirst 개체의 직렬화 시 순환 참조 해결하는 방법 - 두 번째 이야기파일 다운로드1
1086정성태7/14/201128327.NET Framework: 231. Entity Framework 4.1 - CodeFirst 개체의 직렬화 시 순환 참조 해결하는 방법 [1]파일 다운로드1
1085정성태7/14/201128805.NET Framework: 230. Entity Framework 4.1 - Code First + WCF 서비스 시 EndpointNotFoundException 오류 - 두 번째 이야기파일 다운로드1
1084정성태7/11/201134097.NET Framework: 229. SQL 서버 - DB 테이블의 데이터 변경에 대한 알림 처리 [4]파일 다운로드1
1083정성태7/11/201128139.NET Framework: 228. Entity Framework 4.1 - Code First + WCF 서비스 시 EndpointNotFoundException 오류
1082정성태7/10/201127690.NET Framework: 227. basicHttpBinding + 사용자 정의 인증 구현 [2]파일 다운로드1
1081정성태7/9/201127010VC++: 53. Windows 7에서 gcc.exe 실행 시 Access denied 오류 [2]
1080정성태7/8/201125510웹: 23. Sysnet 웹 사이트의 HTML5 변환 기록 - 두 번째 이야기파일 다운로드1
1079정성태7/6/201129950오류 유형: 129. Hyper-V + Realtek 랜카드가 설치된 시스템의 BSOD 현상 [2]
1078정성태7/5/201137455VC++: 52. Chromium 컴파일하는 방법 [2]
1077정성태6/24/201135082.NET Framework: 226. HttpWebRequest 타입의 HaveResponse 속성 이야기파일 다운로드1
1076정성태6/23/201129235오류 유형: 128. SQL Express - User Instance 옵션을 사용한 경우 발생하는 오류 메시지 유형 2가지
1075정성태6/21/201124841VS.NET IDE: 69. 윈폰 프로젝트에서 WCF 서비스 참조할 때 Reference.cs 파일이 비어있는 경우
1074정성태6/20/201124921.NET Framework: 225. 닷넷 네트워크 라이브러리의 트레이스 기능파일 다운로드1
1073정성태6/20/201127158오류 유형: 127. Visual Studio에서 WCF 서비스의 이름 변경 시 발생할 수 있는 오류
... 151  152  153  154  155  156  157  [158]  159  160  161  162  163  164  165  ...