성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
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'>.NET Core/5+ SDK 설치 없이 dotnet-dump 사용하는 방법</h1> <p> 지난 글에 설명한 대로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 리눅스 환경의 .NET Core 3/5+ 메모리 덤프를 분석하는 방법 - 두 번째 이야기 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/13135'>https://www.sysnet.pe.kr/2/0/13135</a> </pre> <br /> 이제 덤프 파일 분석이 dotnet-dump의 개선으로 윈도우 환경에서만큼이나 쉬워졌습니다. 그런데, 여전히 문제가 하나 있습니다. 바로, dotnet-dump 자체가 (런타임이 아닌) SDK 설치를 요구하기 때문에,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>dotnet tool install -g dotnet-dump</span> It was not possible to find any installed .NET Core SDKs Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from: https://aka.ms/dotnet-download </pre> <br /> 가볍게 유지하려고 런타임만 설치된 docker 환경이나, 심지어 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12733#selfcontained'>self-contained 유형</a>으로 배포된 경우에는 설치 자체를 할 수 없다는 제약이 있습니다. 재미있는 건, 사실 dotnet-dump가 SDK 설치 없이도 잘 동작한다는 점입니다. 그래서 그냥 dotnet-dump가 설치된 리눅스 환경에서 복사를 해올 수 있습니다. 방법도 간단합니다. ^^<br /> <br /> 일반적으로 dotnet-dump는 현재 사용자 계정의 "./.dotnet/tools" 밑에 생성이 되고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>which dotnet-dump</span> /home/testusr/.dotnet/tools/dotnet-dump </pre> <br /> 그리고 dotnet-dump 실행 파일 기준으로 ".store" 디렉터리 하위에 dotnet-dump의 설치 버전이 요구하는 부가적인 실행 모듈들이 위치하게 됩니다. 따라서 이 구조만 지켜서 다음과 같이 (약 8MB 정도의) 압축 파일로 만들어 주면,<br /> <br /> <img alt='dotnet-dump-self_1.png' src='/SysWebRes/bbs/dotnet-dump-self_1.png' /><br /> <br /> 이것을 .NET Core/5+ SDK가 설치되지 않은 환경, 예를 들어 아래는 "mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim" 이미지를 기반으로 한 docker 컨테이너에 복사해 실행한 예를 보여줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>apt install unzip</span> # <span style='color: blue; font-weight: bold'>unzip dotnet-dump-exec.zip</span> # <span style='color: blue; font-weight: bold'>chmod 744 dotnet-dump</span> # <span style='color: blue; font-weight: bold'>./dotnet-dump ps</span> 1 dotnet /usr/share/dotnet/dotnet dotnet razor31_sample.dll # <span style='color: blue; font-weight: bold'>./dotnet-dump collect -p 1</span> Writing full to /app/temp/core_20221007_093929 Complete </pre> <br /> 보다시피 정상적으로 덤프를 완료했습니다. 이제 저 파일을 다른 PC에 복사해 "<a target='tab' href='https://www.sysnet.pe.kr/2/0/13135'>리눅스 환경의 .NET Core 3/5+ 메모리 덤프를 분석하는 방법 - 두 번째 이야기</a>" 글에서 설명한 것처럼 편하게 분석하시면 됩니다. ^^<br /> <br /> 대신, 분석(analyze) 기능은 .NET 런타임 또는 SDK가 설치돼 있어야 사용할 수 있습니다. 가령, 닷넷 런타임이 없는 환경에서 analyze 옵션으로 실행하면 이런 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>dotnet-dump analyze core_20221007_093929</span> A fatal error occurred. The required library libhostfxr.so could not be found. If this is a self-contained application, that library should exist in [/home/testusr/temp/.store/dotnet-dump/6.0.328102/dotnet-dump/6.0.328102/tools/netcoreapp3.1/any/]. If this is a framework-dependent application, install the runtime in the global location [/usr/share/dotnet] or use the DOTNET_ROOT environment variable to specify the runtime location or register the runtime location in [/etc/dotnet/install_location]. The .NET runtime can be found at: - https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=ubuntu.18.04-x64&apphost_version=5.0.17 </pre> <br /> 참고로, 리눅스 환경에서 뜬 덤프일지라도 윈도우 환경의 dotnet-dump로 분석할 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 물론, gcore/gdb/procdump 등을 이용해 덤프를 뜨는 방법도 있습니다. 하지만, 이것을 이용해 덤프를 뜨고 싶어도 대개의 일반적인 운영 환경에서는 해당 모듈을 설치해야 합니다. 차라리 8MB 크기의 dotnet-dump zip 파일을 복사하는 것이 낫습니다.<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;' > Dump collection and analysis utility (dotnet-dump) ; <a target='tab' href='https://github.com/dotnet/diagnostics/blob/main/documentation/dotnet-dump-instructions.md'>https://github.com/dotnet/diagnostics/blob/main/documentation/dotnet-dump-instructions.md</a> </pre> <br /> "dotnet-dump analyze" 명령어는 오직 "dotnet-dump collect"로 수집한 덤프에 대해서만 분석을 지원하고 있는 듯합니다. 따라서, gcore 기반의 덤프를 분석하려면 lldb를 이용해야 하는데요, 이를 위해서는 아래의 문서에서 설명한 준비 작업이 필요합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Lab 1.2 Troubleshooting crashes - analyze system-generated core dump files in lldb debugger ; <a target='tab' href='https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/lab-1-2-analyze-core-dumps-lldb-debugger'>https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/lab-1-2-analyze-core-dumps-lldb-debugger</a> // 2022-10-08 업데이트: 아래의 문서를 보면 gcore로 뜬 덤프도 dotnet-dump에서 분석할 수 있다고 합니다. Lab 4.2 Analyze core dump files on another machine - Using WSL to open core dump files ; <a target='tab' href='https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/lab-4-2-analyze-core-dumps-another-machine-wsl'>https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/lab-4-2-analyze-core-dumps-another-machine-wsl</a> </pre> <br /> 역시나 차라리 저런 준비를 하느니 dotnet-dump zip 파일을 복사해 덤프를 뜨는 것이 훨씬 간편합니다.<br /> <a name='dotnet_dump_size'></a> <br /> 그리고 결정적으로, gcore를 기반으로 덤프를 뜨면 (비주얼 스튜디오 예제 웹 프로젝트라도) 수십 GB의 덤프 파일이 생성될 수 있습니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>pmap 1 | grep total</span> total 63416700K // pmap을 이용해 대상 프로세스의 덤프 파일 크기를 미리 예측 # <span style='color: blue; font-weight: bold'>apt-get install gdb zip</span> # <span style='color: blue; font-weight: bold'>gdb</span> (gdb) <span style='color: blue; font-weight: bold'>attach 1</span> (gdb) <span style='color: blue; font-weight: bold'>generate-core-file /app/core_31.dmp</span> warning: target file /proc/1/cmdline contained unexpected null characters Saved corefile /app/core_31.dmp (gdb) <span style='color: blue; font-weight: bold'>quit</span> # <span style='color: blue; font-weight: bold'>zip core_31.zip core_31.dmp</span> adding: core_31.dmp (deflated 100%) # <span style='color: blue; font-weight: bold'>ls -l core_31.zip</span> -rw-r--r-- 1 root root 109822428 Oct 6 21:53 core_31.zip </pre> <br /> 제가 테스트한 "mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim" 컨테이너의 경우 59GB라는 어마어마한 덤프 파일을 생성했는데요, 운영 서버라면 그 정도 크기의 덤프 파일을 생성할 때까지 서비스가 중지된다는 것을 의미합니다. (같은 상황에서 dotnet-dump는 2GB 파일의 덤프를 생성합니다.)<br /> <br /> 그러니까, 다른 거 생각하지 마시고... 그냥 무조건 닷넷 덤프는 "dotnet-dump"로 처리하는 걸로 결정하시면 되겠습니다. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6656
(왼쪽의 숫자를 입력해야 합니다.)