인프런 커뮤니티 질문&답변

dustjdtns00님의 프로필 이미지

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

멀티스레드 프로그래밍에서 디버깅하면서 문제 추적하려면 어떻게 해야하나요?

23.12.16 23:02 작성

·

1.1K

0

멀티스레드 병렬 프로그래밍은 싱글 스레드와 다르게 디버깅하기가 매우 까다롭더라구요 ㅠㅠ

I/O 출력을 하거나 로그 파일로 따로 빼서 로깅을 확인하는건 싱글스레드까지만 가능하고 멀티스레드에서는 별 도움이 되지 못하더라구요

이 외에 다른 방법으로는 디버깅 모드로 실행 시 문제가 발생했을 때, memory를 확인하면서 역추적하면서 문제를 해결하는 방법밖에 떠오르질 않는데, 이 방법이 맞을까요?

예를 들면 여러 스레드를 실행하면서 call 횟수, 작업하는 변수의 주소값, 수행 시간 등을 list에 저장한 다음에 조사식에 해당 list를 끌어와서 확인해보려고 하는데...

현업에서는 멀티스레드 로깅 및 문제 역추적할 때 어떤 방법을 사용하나요..?

 

답변 2

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2023. 12. 20. 15:08

사실 메모리를 봐도 쉽지 않고, 코드를 보면서 상상력(?)을 동원하며 볼 수밖에 없습니다.
그 정도로 세세하게 보는 것은 의미 없고 경합이 일어났을 시 어떤 일이 벌어지는지를 중점으로 봐야합니다.

0

인프런 AI 인턴님의 프로필 이미지

2023. 12. 18. 23:07

안녕하세요, 인프런 AI 인턴입니다.

멀티스레드 프로그래밍에서 디버깅은 실제로 매우 까다롭습니다. dustjdtns00님께서 언급하신 것처럼 변수의 추적, 시간 측정 등을 통해 문제를 역추적하는 방법은 맞습니다. 실제로 현업에서도 사용하는 몇 가지 방법을 소개드리겠습니다:

  1. 조건부 중단점: 다중 스레드 중 특정 조건을 만족하는 경우에만 중단하여 문제가 발생하는 상황을 좁혀나갈 수 있습니다.
  2. 로깅: 스레드별로 분리된 로그 파일을 생성하거나 로그에 스레드 ID를 포함시켜 분석을 용이하게 합니다.
  3. 동기화 문제 해결: mutex, semaphore 등을 활용하여 리소스 접근을 제어하고, 데드락 탐지와 같은 도구를 사용하여 동기화 문제를 진단합니다.
  4. 프로파일링 도구 사용: 시스템의 리소스 사용 현황, 스레드의 상태 및 실행 시간 등을 확인할 수 있는 다양한 프로파일링 도구를 사용하여 성능 병목 현상이나 문제점을 찾아냅니다.
  5. 멀티스레드에 특화된 디버깅 도구 사용: GDB, Visual Studio, 오픈소스 디버깅 도구 등 멀티스레드에 최적화된 디버깅 도구를 사용합니다.

더불어, Spring Boot 애플리케이션의 로깅 설정을 참고하면 멀티스레드 환경에서 로깅을 좀 더 체계적으로 수행할 수 있는 방법을 얻을 수도 있습니다. 예를 들어, Spring Boot에서는 다음과 같은 방식으로 로깅 레벨을 조정하거나 추가적인 로깅 모드를 활성화 할 수 있습니다:

  • --debug 또는 --trace 플래그를 이용하여 애플리케이션을 실행하면 기본 로깅 외에 더 많은 정보를 출력하여 문제를 진단하는 데 도움을 줄 수 있습니다.
  • Spring Data JPA에서는 CustomizableTraceInterceptor를 사용하여 JpaRepository 내부에서 호출되는 메소드에 대한 더 상세한 로깅 정보를 얻을 수 있습니다.

이러한 방법들을 자신이 사용하고 있는 언어나 환경에 맞게 적용해볼 수 있습니다.

참조 URL:
- Spring Boot 로깅 문서: Console Output
- Spring Data JPA 로깅 예제: FAQ.Common

이러한 기법들을 혼합하여 사용하면 멀티스레드 환경에서 발생하는 복잡한 문제들을 효과적으로 분석하고 해결할 수 있게 됩니다.