성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 그냥 RSS Reader 기능과 약간의 UI 편의성 때문에 사용...
[이종효] 오래된 소프트웨어는 보안 위협이 되기도 합니다. 혹시 어떤 기능...
[정성태] @Keystroke IEEE의 문서를 소개해 주시다니... +_...
[손민수 (Keystroke)] 괜히 듀얼채널 구성할 때 한번에 같은 제품 사라고 하는 것이 아...
[정성태] 전각(Full-width)/반각(Half-width) 기능을 토...
[정성태] Vector에 대한 내용은 없습니다. Vector가 닷넷 BCL...
[orion] 글 읽고 찾아보니 디자인 타임에는 InitializeCompon...
[orion] 연휴 전에 재현 프로젝트 올리자 생각해 놓고 여의치 않아서 못 ...
[정성태] 아래의 글에 정리했으니 참고하세요. C# - Typed D...
[정성태] 간단한 재현 프로젝트라도 있을까요? 저런 식으로 설명만 해...
글쓰기
제목
이름
암호
전자우편
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'>Visual Studio - 원격 Docker container 내에 실행 중인 응용 프로그램에 대한 디버깅</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;' > Attach to a process running on a Docker container ; <a target='tab' href='https://learn.microsoft.com/en-us/visualstudio/debugger/attach-to-process-running-in-docker-container'>https://learn.microsoft.com/en-us/visualstudio/debugger/attach-to-process-running-in-docker-container</a> </pre> <br /> 제 경우에, 특정 container에서 실행 중인 응용 프로그램이, (다른 container에 있는 것은 잘 동작하는데) 그것만 문제가 발생해서 디버깅을 해야만 했습니다. <br /> <br /> 처음에는, 덤프를 떠서 분석하려고 했는데요, 해당 예제가 .NET Core 2.1이어서 <a target='tab' href='https://www.sysnet.pe.kr/2/0/13136'>(3.1부터 가능한) dotnet-dump</a>를 사용할 수 없어 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12083'>lldb로 덤프를 남기면 약 60GB</a>가 나왔습니다. ^^;<br /> <br /> 그러다 위의 문서를 통해 원격 docker container에도 Process Attach 기능이 있다는 것을 알게 되었는데요, 방법이 매우 쉽습니다. 문서에 따라, docker를 호스팅하는 Linux 서버에 SSH 서버만 설치해 주면 됩니다. (대부분의 Linux 서버는 기본적으로 설치가 돼 있습니다.)<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'>sudo apt-get install openssh-server unzip curl</span> </pre> <br /> 이후에는 Visual Studio에서 "Debug" / "Attach to Process..." 메뉴를 선택해 뜨는 창에서 "Connection type"을 "Docker (Linux Container)"로 선택한 다음 "Connection target"의 "Find" 버튼을 누르면 "Select Docker Container" 창이 뜹니다.<br /> <br /> 거기서 SSH 서버가 실행 중인 (docker를 호스팅하는) 리눅스 머신에 대한 접속 정보를 추가해 주면,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='ssh_container_dbg_2.png' src='/SysWebRes/bbs/ssh_container_dbg_2.png' /><br /> <br /> Visual Studio가 해당 정보를 이용해 리눅스 머신에 접속한 후 docker로 운영 중인 컨테이너 목록을 나열합니다.<br /> <br /> <img alt='ssh_container_dbg_3.png' src='/SysWebRes/bbs/ssh_container_dbg_3.png' /><br /> <br /> 이후 디버깅을 원하는 응용 프로그램을 호스팅 중인 컨테이너 항목을 선택하면, 다음과 같이 그 컨테이너에서 실행 중인 .NET 프로세스를 나열해 줍니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='ssh_container_dbg_4.png' src='/SysWebRes/bbs/ssh_container_dbg_4.png' /><br /> <br /> 위의 조건에서 "Attach to:"를 반드시 "Managed (.NET Core for Unix) code"로 선택한 후 해당 프로세스를 "Attach" 버튼을 눌러 연결하면 이제부터 Visual Studio가 디버깅 모드로 진입합니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이제 Visual Studio 내에 해당 컨테이너에서 운영 중인 응용 프로그램의 소스코드를 열어 Breakpoint를 걸면서 디버깅을 하시면 됩니다. 그런데, 대개의 경우 BP를 걸고 싶어도 다음과 같이 안 될 것입니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='ssh_container_dbg_5.png' src='/SysWebRes/bbs/ssh_container_dbg_5.png' /><br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. The breakpoint will not currently be hit. No symbols have been loaded for this document. </pre> <br /> 따라서 "Debug" / "Optinos" 창에서 다음과 같이 "<a target='tab' href='https://www.sysnet.pe.kr/2/0/12401'>Enable Just My Code</a>" 옵션을 꺼줍니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='ssh_container_dbg_1.png' src='/SysWebRes/bbs/ssh_container_dbg_1.png' /><br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Off - Enable Just My Code </pre> <br /> 그럼 정상적으로 BP도 걸리고, 응용 프로그램 내에서 예외가 발생하면 Output 창에 "Exception thrown"도 뜨게 될 것입니다. 예외가 발생한 코드를 알고 싶다면 Ctrl+Alt+E 키를 눌러 "Exception Settings" 창에서 해당 예외, 예를 들어 "Exception thrown: 'System.InvalidOperationException' in Microsoft.AspNetCore.Http.dll" 이렇게 발생하고 있다면 다음과 같이 "System.InvalidOperationException" 예외를 검색해 Check 해주면,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='ssh_container_dbg_6.png' src='/SysWebRes/bbs/ssh_container_dbg_6.png' /><br /> <br /> 위의 화면과 같이 자동으로 예외가 발생한 소스코드 창을 열어 해당 라인에서 BP가 걸리게 됩니다. 아울러, 좌측 하단의 Locals 창에는 일부 변수의 값을 확인하는 것도 가능합니다. 모든 값이 나오진 않고 일부는 "Cannot obtain value of the local variable or argument because it is not available at this instruction pointer, possibly because it has been optimized away."라는 메시지로 값이 구해지지 않는데요, 이에 대해서는 Release 관련한 최적화 작업이 관여한 것이므로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 소스 코드가 없는 닷넷 어셈블리를 디버깅할 때 지역 변숫값을 확인하는 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/11036'>https://www.sysnet.pe.kr/2/0/11036</a> </pre> <br /> 어쩔 수 없습니다. 그래도, 저만큼이라도 Live 디버깅이 되면 아마도 대부분의 문제는 디버깅이 가능할 것입니다. ^^ <br /> <br /> 그나저나, 방법만으로 보면 윈도우 환경에서는 <a target='tab' href='https://www.sysnet.pe.kr/2/0/1339'>Remote Debugging Tools</a>도 설치해야 하는 번거로움이 있으니 오히려 리눅스에서의 원격 디버깅이 더 편합니다. ^^;<br /> <br /> <hr style='width: 50%' /><br /> <br /> 간혹 Attach 했을 때 다음과 같은 메시지와 함께 실패할 때가 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Failed to launch debug adapter. Additional information may be available in the output window. Could not create the shell, a connectivity error has occured. Client not connected. Failed to launch debug adapter 'coreclr'. </pre> <br /> 제 경우에는 그냥 무시하고 재차 Attach를 했더니 정상적으로 연결이 됐습니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
3415
(왼쪽의 숫자를 입력해야 합니다.)