Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 7개 있습니다.)
개발 환경 구성: 401. .NET Core 콘솔 응용 프로그램을 배포(publish) 시 docker image 자동 생성
; https://www.sysnet.pe.kr/2/0/11708

개발 환경 구성: 402. .NET Core 콘솔 응용 프로그램을 docker로 실행/디버깅하는 방법
; https://www.sysnet.pe.kr/2/0/11709

VS.NET IDE: 143. Visual Studio - ASP.NET Core Web Application의 "Enable Docker Support" 옵션으로 달라지는 점
; https://www.sysnet.pe.kr/2/0/12171

VS.NET IDE: 144. .NET Core 콘솔 응용 프로그램을 배포(publish) 시 docker image 자동 생성 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/12197

VS.NET IDE: 185. Visual Studio - 원격 Docker container 내에 실행 중인 응용 프로그램에 대한 디버깅
; https://www.sysnet.pe.kr/2/0/13351

닷넷: 2156. .NET 7 이상의 콘솔 프로그램을 (dockerfile 없이) 로컬 docker에 배포하는 방법
; https://www.sysnet.pe.kr/2/0/13437

개발 환경 구성: 704. Visual Studio - .NET 8 프로젝트부터 dockerfile에 추가된 "USER app" 설정
; https://www.sysnet.pe.kr/2/0/13547




Visual Studio - 원격 Docker container 내에 실행 중인 응용 프로그램에 대한 디버깅

오호~~~ 아주 훌륭한 기능이 있군요. ^^ 공식 문서에 그 방법을 자세하게 설명하고 있습니다.

Attach to a process running on a Docker container
; https://learn.microsoft.com/en-us/visualstudio/debugger/attach-to-process-running-in-docker-container

제 경우에, 특정 container에서 실행 중인 응용 프로그램이, (다른 container에 있는 것은 잘 동작하는데) 그것만 문제가 발생해서 디버깅을 해야만 했습니다.

처음에는, 덤프를 떠서 분석하려고 했는데요, 해당 예제가 .NET Core 2.1이어서 (3.1부터 가능한) dotnet-dump를 사용할 수 없어 lldb로 덤프를 남기면 약 60GB가 나왔습니다. ^^;

그러다 위의 문서를 통해 원격 docker container에도 Process Attach 기능이 있다는 것을 알게 되었는데요, 방법이 매우 쉽습니다. 문서에 따라, docker를 호스팅하는 Linux 서버에 SSH 서버만 설치해 주면 됩니다. (대부분의 Linux 서버는 기본적으로 설치가 돼 있습니다.)

$ sudo apt-get install openssh-server unzip curl

이후에는 Visual Studio에서 "Debug" / "Attach to Process..." 메뉴를 선택해 뜨는 창에서 "Connection type"을 "Docker (Linux Container)"로 선택한 다음 "Connection target"의 "Find" 버튼을 누르면 "Select Docker Container" 창이 뜹니다.

거기서 SSH 서버가 실행 중인 (docker를 호스팅하는) 리눅스 머신에 대한 접속 정보를 추가해 주면,

ssh_container_dbg_2.png

Visual Studio가 해당 정보를 이용해 리눅스 머신에 접속한 후 docker로 운영 중인 컨테이너 목록을 나열합니다.

ssh_container_dbg_3.png

이후 디버깅을 원하는 응용 프로그램을 호스팅 중인 컨테이너 항목을 선택하면, 다음과 같이 그 컨테이너에서 실행 중인 .NET 프로세스를 나열해 줍니다.

ssh_container_dbg_4.png

위의 조건에서 "Attach to:"를 반드시 "Managed (.NET Core for Unix) code"로 선택한 후 해당 프로세스를 "Attach" 버튼을 눌러 연결하면 이제부터 Visual Studio가 디버깅 모드로 진입합니다.




이제 Visual Studio 내에 해당 컨테이너에서 운영 중인 응용 프로그램의 소스코드를 열어 Breakpoint를 걸면서 디버깅을 하시면 됩니다. 그런데, 대개의 경우 BP를 걸고 싶어도 다음과 같이 안 될 것입니다.

ssh_container_dbg_5.png

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.

따라서 "Debug" / "Optinos" 창에서 다음과 같이 "Enable Just My Code" 옵션을 꺼줍니다.

ssh_container_dbg_1.png

Off - Enable Just My Code

그럼 정상적으로 BP도 걸리고, 응용 프로그램 내에서 예외가 발생하면 Output 창에 "Exception thrown"도 뜨게 될 것입니다. 예외가 발생한 코드를 알고 싶다면 Ctrl+Alt+E 키를 눌러 "Exception Settings" 창에서 해당 예외, 예를 들어 "Exception thrown: 'System.InvalidOperationException' in Microsoft.AspNetCore.Http.dll" 이렇게 발생하고 있다면 다음과 같이 "System.InvalidOperationException" 예외를 검색해 Check 해주면,

ssh_container_dbg_6.png

위의 화면과 같이 자동으로 예외가 발생한 소스코드 창을 열어 해당 라인에서 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 관련한 최적화 작업이 관여한 것이므로,

소스 코드가 없는 닷넷 어셈블리를 디버깅할 때 지역 변숫값을 확인하는 방법
; https://www.sysnet.pe.kr/2/0/11036

어쩔 수 없습니다. 그래도, 저만큼이라도 Live 디버깅이 되면 아마도 대부분의 문제는 디버깅이 가능할 것입니다. ^^

그나저나, 방법만으로 보면 윈도우 환경에서는 Remote Debugging Tools도 설치해야 하는 번거로움이 있으니 오히려 리눅스에서의 원격 디버깅이 더 편합니다. ^^;




간혹 Attach 했을 때 다음과 같은 메시지와 함께 실패할 때가 있습니다.

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'.

제 경우에는 그냥 무시하고 재차 Attach를 했더니 정상적으로 연결이 됐습니다.




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







[최초 등록일: ]
[최종 수정일: 6/21/2023]

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

비밀번호

댓글 작성자
 



2023-05-19 09시22분
정성태

... 181  182  183  184  185  [186]  187  188  189  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
325정성태9/8/200627347    답변글 디버깅 기술: 5.12. CCP를 이용한 Windows Source Code 수준의 디버깅
329정성태8/19/200626368    답변글 디버깅 기술: 5.13. 소스 서버 구성 [1]
332정성태8/20/200627849    답변글 디버깅 기술: 5.14. GAC 에 등록된 Assembly 디버그 [2]
341정성태9/16/200620188    답변글 디버깅 기술: 5.15. [내용 예약]
342정성태9/16/200637749    답변글 디버깅 기술: 5.16. ASP.NET 디버깅 환경 구성 [1]파일 다운로드1
306정성태2/13/200717278기타: 15. .NET 이 생산성이 높다는 증거(!)
304정성태7/21/200619195VS.NET IDE: 41. 하위 폴더의 모든 프로젝트의 출력물을 제거 (Clean)
305정성태7/21/200618859    답변글 VS.NET IDE: 41.1. 하위 폴더의 모든 프로젝트의 출력물을 제거 (Clean) [1]
303정성태7/20/200616896Team Foundation Server: 12. 사용자 계정 재생성에 따른 Version Control 영향
302정성태8/21/200618451Team Foundation Server: 11. TFS Team Build와 VC++ Project 설정
299정성태7/23/200618918개발 환경 구성: 5. VMWare - VM 생성 화면 캡쳐
300정성태7/15/200623312    답변글 개발 환경 구성: 5.1. VMWare 오류 유형 - The handle is invalid.
301정성태7/18/200618333    답변글 개발 환경 구성: 5.2. VMWare - 사용 후기.
298정성태7/14/200618744개발 환경 구성: 4. VMWare Server를 64bit 운영체제에 설치 시 주의 사항 [2]
296정성태7/10/200628022.NET Framework: 73. [ASP.NET] HTC(DHTML Control Behavior)를 WebResource.axd로 제공하는 방법 [3]
295정성태7/1/200621242VC++: 25. Microsoft National Language Support Downlevel APIs 1.0 사용 방법파일 다운로드1
294정성태6/30/200617802.NET Framework: 72. XSDObjectGen.EXE 기능 개선
293정성태6/29/200619528Team Foundation Server: 10. TFS 버전 컨트롤(TFVC)에 참여시킨 프로젝트의 로컬 경로를 옮기는 방법
290정성태6/26/200616904Team Foundation Server: 9. HTTPS를 통한 Team Server 접근 - 두 번째 이야기 [1]
291정성태6/26/200618217    답변글 Team Foundation Server: 9.1. [선행 작업] HTTPS 를 통한 Team Server 접근 - 두번째 이야기 [1]
292정성태6/26/200617938    답변글 Team Foundation Server: 9.2. TF30177 오류 발생
307정성태8/3/200619595    답변글 Team Foundation Server: 9.3. Team Server 접근 이름을 바꾸는 방법 [1]파일 다운로드1
308정성태2/18/200719274        답변글 Team Foundation Server: 9.4. Team Server HTTPS 접근 완료. ^^ [1]
288정성태6/26/200634163오류 유형: 10. error MSB6006: "aspnet_merge.exe" exited with code 1
286정성태6/23/200622270웹: 4. 웹 사이트 식별자(Identifier) 값 변경
285정성태6/20/200622557오류 유형: 9. [TFS] Report 관련 서비스를 조회할 때 rsErrorImpersonatingUser 오류 메시지 발생 [1]
... 181  182  183  184  185  [186]  187  188  189  190  191  192  193  194  195  ...