성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>마이크로소프트의 CoreCLR 프로파일러 리눅스 예제를 Visual Studio F5 원격 디버깅하는 방법</h1> <p> CoreCLR 프로파일러 예제를 리눅스 운영체제에서 빌드해 보고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 마이크로소프트의 CoreCLR 프로파일러 예제 빌드 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/11294'>https://www.sysnet.pe.kr/2/0/11294</a> </pre> <br /> 이것을 Visual Studio의 CMake 프로젝트로 변경도 해봤는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 마이크로소프트의 CoreCLR 프로파일러 예제를 Visual Studio CMake로 빌드하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11842'>http://www.sysnet.pe.kr/2/0/11842</a> </pre> <br /> F5 디버깅이 안 된다는 것은 차라리 리눅스에서 개발하는 것이 나을 정도이므로 별로 효용성이 없습니다. 하지만, 이 프로젝트를 비주얼 스튜디오의 리눅스 프로젝트로 변경하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11844'>http://www.sysnet.pe.kr/2/0/11844</a> </pre> <br /> F5 디버깅이 가능합니다. 변경 과정도 그다지 어렵지 않습니다. 그냥 리눅스 프로젝트 생성 후 위의 글에 설명한 데로 so 프로젝트로 변경하고 빌드에 필요한 dotnet core include 파일들을 포함하면 됩니다. include 파일들은 vcxproj 파일에 다음과 같은 식으로 일괄 포함하는 것도 가능하지만,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <ItemGroup> <ClInclude Include=".\cor\**\*.h" /> </ItemGroup> </pre> <br /> 일일이 추가해도 상관없습니다. 그다음 리눅스 측에서 빌드할 때 cor 폴더의 header 파일들을 찾을 수 있도록 "C/C++" / "General"의 "Additional Include Directories"에 다음의 4개 폴더를 등록합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ./cor/src/inc ./cor/src/pal/inc/rt ./cor/src/pal/inc ./cor/src/pal/prebuilt/inc </pre> <br /> 실제로 dotnet core 헤더 파일들에는 하위 폴더들이 많은데 프로파일러 예제 빌드로는 저 4개의 폴더만 있으면 됩니다. 그리고 "C/C++" / "Preprocessor"의 "Preprocessor Definitions"에 "BIT64;PAL_STDCPP_COMPAT;PLATFORM_UNIX" 매크로 상수도 추가한 후 경고를 없애기 위해 "C/C++" / "Command Line"의 "Additional Options"에 다음의 옵션도 넣어줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > -Wno-undef -Wno-invalid-noreturn -fms-extensions -Wno-conversion -Wno-pragma-pack -Wno-unused-variable </pre> <br /> 마지막으로, "C/C++" / "General"의 "C++ Compiler"를 clang++로 변경하면 끝!<br /> <br /> (<a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1430&boardid=331301885'>첨부 파일은 이렇게 변경한 프로젝트 파일</a>입니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그럼 F5 디버깅을 해봐야 할 텐데요. 이를 위해 /etc/profile에 CORECLR 관련 환경 변수를 등록하든가,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ 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 </pre> <br /> 아니면 프로젝트 속성 창의 "Debugging"에 "Pre-Launch Command"로 다음과 같이 환경 변수를 등록하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > export CORECLR_ENABLE_PROFILING=1; export CORECLR_PROFILER={cf0d821e-299b-5307-a3d8-b283c03916dd};export CORECLR_PROFILER_PATH=libcorprofiler.so; </pre> <br /> (위에서는 CORECLR_PROFILER_PATH에 경로를 생략했는데 <a target='tab' href='https://www.sysnet.pe.kr/2/0/11847'>이렇게 하려면 /etc/ld.so.conf에 경로를 등록</a>해야 합니다.)<br /> <br /> 그다음 실행 파일을 /usr/bin/dotnet으로, 인자로 닷넷 예제 프로젝트의 빌드된 DLL을 주면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Program: /usr/bin/dotnet Program Arguments: webapp.dll Working Directory: ~/coreapp </pre> <br /> 이후 비주얼 스튜디오에서 F5 키를 눌러 원격 디버깅을 진행할 수 있습니다. 오~~~ 이제야 개발할 맛이 납니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 기본 프로파일러 예제는 의존성이 많은데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ 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) </pre> <br /> 다음의 글에 따라 어느 정도 줄이는 것이 가능합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Linux 응용 프로그램의 (C++) so 의존성 줄이기(ReleaseMinDependency) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11845'>http://www.sysnet.pe.kr/2/0/11845</a> </pre> <br /> export된 symbol을 보면 재미있는 점이 있는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ 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 <span style='color: blue; font-weight: bold'>000000000000e240 T DllCanUnloadNow 000000000000e170 T DllGetClassObject</span> 0000000000217018 D EnterMethodAddress 000000000001419c r GCC_except_table1 ...[생략]... </pre> <br /> 저렇게 윈도우에서의 프로파일러와 유사한 COM 접근 방식을 리눅스에서도 그대로 흉내 내고 있습니다. ^^ 실제로 소스코드를 봐도 vtable 기반 하의 COM 접근 방식을 동일하게 구현하고 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> dotnet core의 헤더 파일들을 모두 포함시키면 다음과 같은 식의 빌드 오류가 발생할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 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> </pre> <br /> 왜냐하면, 포함된 폴더에는 헤더 파일뿐만 아니라 idl, rc, cpp 등의 파일도 있기 때문인데요, 따라서 그 파일들은 빌드에서 제외해야 합니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 리눅스 프로젝트 빌드 시 다음과 같은 오류가 발생한다면?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 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. </pre> <br /> 현재 비주얼 스튜디오의 빌드 타겟이 ARM으로 설정되어 있기 때문입니다. x64로 바꿔주면 정상적으로 빌드가 됩니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
4829
(왼쪽의 숫자를 입력해야 합니다.)