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분
정성태

... 61  62  63  64  65  66  67  68  69  70  71  72  73  [74]  75  ...
NoWriterDateCnt.TitleFile(s)
12083정성태12/17/201922235Linux: 27. linux - lldb를 이용한 .NET Core 응용 프로그램의 메모리 덤프 분석 방법 [2]
12082정성태12/17/201920523오류 유형: 585. lsof: WARNING: can't stat() fuse.gvfsd-fuse file system
12081정성태12/16/201922384개발 환경 구성: 465. 로컬 PC에서 개발 중인 ASP.NET Core 웹 응용 프로그램을 다른 PC에서도 접근하는 방법 [5]
12080정성태12/16/201919525.NET Framework: 870. C# - 프로세스의 모든 핸들을 열람
12079정성태12/13/201921400오류 유형: 584. 원격 데스크톱(rdp) 환경에서 다중 또는 고용량 파일 복사 시 "Unspecified error" 오류 발생
12078정성태12/13/201921213Linux: 26. .NET Core 응용 프로그램을 위한 메모리 덤프 방법 [3]
12077정성태12/13/201920327Linux: 25. 자주 실행할 명령어 또는 초기 환경을 "~/.bashrc" 파일에 등록
12076정성태12/12/201918821디버깅 기술: 142. Linux - lldb 환경에서 sos 확장 명령어를 이용한 닷넷 프로세스 디버깅 - 배포 방법에 따른 차이
12075정성태12/11/201919599디버깅 기술: 141. Linux - lldb 환경에서 sos 확장 명령어를 이용한 닷넷 프로세스 디버깅
12074정성태12/10/201919251디버깅 기술: 140. windbg/Visual Studio - 값이 변경된 경우를 위한 정지점(BP) 설정(Data Breakpoint)
12073정성태12/10/201920844Linux: 24. Linux/C# - 실행 파일이 아닌 스크립트 형식의 명령어를 Process.Start로 실행하는 방법
12072정성태12/9/201917642오류 유형: 583. iisreset 수행 시 "No such interface supported" 오류
12071정성태12/9/201921156오류 유형: 582. 리눅스 디스크 공간 부족 및 safemode 부팅 방법
12070정성태12/9/201923075오류 유형: 581. resize2fs: Bad magic number in super-block while trying to open /dev/.../root
12069정성태12/2/201919469디버깅 기술: 139. windbg - x64 덤프 분석 시 메서드의 인자 또는 로컬 변수의 값을 확인하는 방법
12068정성태11/28/201928100디버깅 기술: 138. windbg와 Win32 API로 알아보는 Windows Heap 정보 분석 [3]파일 다운로드2
12067정성태11/27/201919532디버깅 기술: 137. 실제 사례를 통해 Debug Diagnostics 도구가 생성한 닷넷 웹 응용 프로그램의 성능 장애 보고서 설명 [1]파일 다운로드1
12066정성태11/27/201919170디버깅 기술: 136. windbg - C# PInvoke 호출 시 마샬링을 담당하는 함수 분석 - OracleCommand.ExecuteReader에서 OpsSql.Prepare2 PInvoke 호출 분석
12065정성태11/25/201917500디버깅 기술: 135. windbg - C# PInvoke 호출 시 마샬링을 담당하는 함수 분석파일 다운로드1
12064정성태11/25/201920398오류 유형: 580. HTTP Error 500.0/500.33 - ANCM In-Process Handler Load Failure
12063정성태11/21/201919336디버깅 기술: 134. windbg - RtlReportCriticalFailure로부터 parameters 정보 찾는 방법
12062정성태11/21/201918847디버깅 기술: 133. windbg - CoTaskMemFree/FreeCoTaskMem에서 발생한 덤프 분석 사례 - 두 번째 이야기
12061정성태11/20/201919286Windows: 167. CoTaskMemAlloc/CoTaskMemFree과 윈도우 Heap의 관계
12060정성태11/20/201920865디버깅 기술: 132. windbg/Visual Studio - HeapFree x64의 동작 분석
12059정성태11/20/201920037디버깅 기술: 131. windbg/Visual Studio - HeapFree x86의 동작 분석
12058정성태11/19/201920680디버깅 기술: 130. windbg - CoTaskMemFree/FreeCoTaskMem에서 발생한 덤프 분석 사례
... 61  62  63  64  65  66  67  68  69  70  71  72  73  [74]  75  ...