Visual Studio에서 단일 스레드를 디버깅하는 방법은 무엇입니까?


254

일부 프로젝트에 대한 솔루션이 있습니다. 다른 프로젝트에는 몇 가지 중단 점이 있습니다. 첫 번째 스레드가 이러한 중단 점 중 하나에 도달했는지 추적하고 다른 스레드가 동일한 코드 블록에 들어가더라도 단일 스레드를 계속 추적하고 싶습니다.

중단 점, 즉 스레드 이름 = ... 또는 스레드 ID = ...에 대한 조건을 정의하여 이것이 가능하다는 것을 알고 있습니다. 그러나 제 경우는로드가 많은 ASP.NET 응용 프로그램이며 w3wp.exe많은 경우에 연결하자마자 스레드가 중단 점에 도달합니다. 와 같은 것이 필요합니다 ThreadLocal<break-point>.

가능합니까? 그렇다면 어떻게?


7
@Paolo :이 웹 응용 프로그램은 대규모 웹 팜의 핵심으로 작동하며 테스트 시나리오에서 버그가있는 상황을 모방하는 것은 불가능합니다.
Xaqron

답변:


150

다른 스레드가 코드를 실행하지 않기 때문에 스레드 고정 / 해동은 잘못된 방법입니다.

가장 정확하고 유용한 방법은 다음과 같습니다.

  1. 중단 점 창에서 Ctrl + A를 누르십시오 (모든 중단 점을 선택하십시오).
  2. 마우스 오른쪽 버튼을 클릭하고 "필터 ..."를 선택하십시오.
  3. "ThreadId = (현재 스레드 ID)"를 입력하십시오.

에서 비주얼 스튜디오 2015 과 새로운 프로세스는 유사합니다 :

  1. 중단 점 창에서 Ctrl + A를 누르십시오 (모든 중단 점을 선택하십시오).
  2. 마우스 오른쪽 버튼을 클릭하고 "설정 ..."을 선택하십시오.
  3. "조건"을 확인하고 드롭 다운에서 "필터"를 선택하십시오.
  4. "ThreadId = (현재 스레드 ID)"를 입력하십시오.

따라서 모든 스레드가 실행되지만 디버거는 현재 스레드에서만 적중합니다.


51
"스텝"디버거 명령이 다른 스레드에 들어 가지 못하게합니까? 그것은 내가 가진 큰 문제였습니다. 나는 스레드를 밟고 있으며 갑자기 완전히 관련이없는 코드 부분에 빠져 있습니다. 더 이상 Visual Studio에서 개발하지 않으므로 테스트 할 수 없습니다.
Matt Faus

8
중단 점 창에서 마우스 오른쪽 버튼을 클릭하면 "filter"명령이 없습니다 ... 어쨌든 현재 스레드 ID를 어떻게 찾을 수 있습니까? -바로 창으로 가고 타이핑을 System.Threading.Thread.CurrentThread.ManagedThreadId하거나 무언가를합니까?
BrainSlugs83

5
VS (2015, Community Edition)에서는 여러 중단 점 설정을 한 번에 수정할 수 없습니다. 따라서 필터는 하나씩 만 설정할 수 있습니다.
robert4

5
나는이 문제를 영원히 겪었고, 마지막 직장에서 맹세 할 수 있었다. 작업중 인 스레드에 충실 할 수있는 일식과 같은 시각적 스튜디오를 만드는 설정을 찾았지만 그것을 찾을 수 없거나 참조 할 수 없다 그것에. 꿈을 꾸고 있는지 궁금해지기 시작했습니다.
stu

7
-1 중단 점 만 허용하지만 실제로는 디버그 할 수 없기 때문에 단일 스레드를 디버깅하기 위해이 방법이 작동하지 않습니다.
Serge Rogatch

338

내가 한 일은 다음과 같습니다.

  1. 내가 찾고있는 스레드에만 맞을 것이라는 조건부 중단 점을 설정하십시오.

  2. 중단 점에 도달하고 원하는 스레드에 도달하면 Visual Studio 스레드 창 (디버깅-> Windows-> 스레드)에서 Ctrl+ A(모든 스레드를 선택)를 누른 다음 Ctrl현재 스레드 를 + 클릭하십시오. . 디버그하려는 스레드를 제외한 모든 스레드가 선택되어 있어야합니다.

  3. 마우스 오른쪽 버튼을 클릭하고 "고정"을 선택하십시오.

이제 Visual Studio는 해동 된 스레드 만 통과합니다. 아마도 고정 된 모든 스레드를 반복해야하기 때문에이 작업을 수행 할 때 속도가 훨씬 느린 것 같지만 멀티 스레드 디버깅에 약간의 정신이 생겼습니다.


1
다른 스레드에서 약 8 개의 작업을 실행하는 컨텍스트에서는 작동하지 않습니다. 다른 모든 스레드를 고정시키고 "스텝 오버"하지만 IDE가 잠시 정지 된 다음 다른 스레드로 이동합니다.
Meta-Knight

3
@ Diego : 더 이상 프로젝트를 진행하고 있지 않지만 하나를 제외한 모든 스레드를 고정하려는 경우 스레드가 버그가있는 상황에서 보완 적이기 때문에 버그를 일으킨 시나리오가 변경됩니다. 이것은 우아한 솔루션이지만이 기능은 VS에 포함되어야합니다.
Xaqron

3
@ Meta-Knight 메인 스레드를 제외한 모든 스레드를 고정해야합니다 . 이 IDE를 좋아하지 않는다면 동결되지 않을 것입니다
Alex Zhukovskiy

15

방금 원하는 것을 정확하게 수행하는 Visual Studio 2010+ 확장 프로그램을 출시했습니다. 그리고 그것은 무료입니다 :).

표시

이 Visual Studio 확장에는 두 개의 바로 가기와 도구 모음 단추가 추가되어 개발자가 멀티 스레드 응용 프로그램을 디버깅하는 동안 단일 스레드에 쉽게 집중할 수 있습니다.

스레드 창에 수동으로 들어가야 할 필요성을 대폭 줄이면서 따라야하는 스레드를 제외한 모든 스레드를 동결 / 해동하여 생산성을 향상시킵니다.

풍모

추가 실행을 현재 스레드로만 제한하십시오. 다른 모든 스레드를 고정시킵니다. 바로 가기 : CTRL + T + T 또는 눈송이 버튼. 다음 단일 스레드로 전환하십시오 (ID 기반). 현재 스레드를 변경하고 다른 모든 스레드를 고정시킵니다. 바로 가기 : CTRL + T + J 또는 다음 버튼.

그것을 확인 여기에 갤러리에 온, 공식 페이지 또는 Github의 저장소 .


어떤 버전의 VS를 사용하고 있습니까?
Erwin Mayer

확장 프로그램을 설치했지만 제대로 작동하지 않았습니다 (현재 프로젝트에서는 VS2010을 사용합니다). [쓰레드가 활성화되는 데 문제가 있다고 생각한 방식은 스레드가 생성 될 때 발생합니다. 아마도 표준 동작이므로 이전 주석을 제거했습니다].
wip

3
이것을 확인하겠습니다. Microsoft의 가장 큰 디버깅 오류 중 하나를 해결하려고 시도한 유일한 사람 일 수도 있습니다.
stu

아아, 그것은 vs2012에 설치되지 않습니다. 최신 버전이 있습니까? 아니면 직접 만들 수 있도록 소스 코드를 공유 하시겠습니까?
stu

@stu 소스 코드는 Codeplex에 있습니다 : singlethread.codeplex.com VS 2012 및 VS 2013에서 작동해야하지만 업데이트하지 않았습니다 (아무도 요청하지 않았으며 직접 필요하지 않았습니다). VS 2012 +에서 쉽게 작동하고 Codeplex에 커밋 할 수 있다면 갤러리에서도 푸시 할 수 있습니다.
Erwin Mayer

13

웹 응용 프로그램과 같이 여러 스레드가 생성되면 @MattFaus 답변이 작동하지 않습니다. 내가 대신 한 것은 다음과 같습니다

  • 원하는 기능에서 스레드를 중단하도록 중단 점을 설정하십시오.
  • 스레드가 중단 점에 도달하고 일시 중지되면 중단 점을 제거하고 F8, F10 및 F11을 사용하여 디버깅을 계속하여 다른 스레드를 실행할 수 있습니다.

모든 주요 문제를 읽은 후이 해결 방법이 저에게 효과적이었습니다.
Swanand Pangam

9

약간 내가 사용했던 다른 접근 방식 :

  1. 정상적인 중단 점을 작성하여 적중
  2. 스레드 창에서 현재 디버깅중인 관리 스레드 ID를 찾으십시오.
  3. 중단 점 창 및 선택기 필터에서 중단 점을 마우스 오른쪽 단추로 클릭하십시오.
  4. ThreadId = xxx를 입력하십시오. 여기서 xxx는 2의 스레드 ID입니다.
  5. 이제 다른 스레드를 중단하지 않고 중단 점에 도달하지 않고 디버깅 할 수 있습니다

이것은 두 번째 스레드가 중단 점에 도달하기 전에 위의 작업을 수행 할 시간이 있다고 가정합니다. 위의 작업을 수행하기 전에 다른 스레드가 중단 점에 도달하면 스레드 창에서 마우스 오른쪽 단추를 클릭하고 고정을 선택할 수 있습니다.


3
+1. "두 번째 스레드가 중단 점에 도달하기 전에 시간이 있다고 가정합니다." 나는 세미콜론을 자물쇠로 감싸고 세미콜론에 중단 점을 둡니다. 중단 점에 처음 도달하면 중단 점을 비활성화합니다. 잠금으로 인해 다른 스레드가 들어올 수 없습니다. lock(m_someObject) { ; }
bluedog

Google을 저장하기 위해 스레드 창은 디버그> Windows> 스레드에 있습니다.
Gabe

2

VS 2019에서 :

  1. 어딘가에 중단 점을 설정하십시오.
  2. 실이 올 때까지 F5 (계속)를 누르십시오.
  3. 중단 점을 클릭하여 제거하십시오.
  4. F10 또는 F11을 사용하여 나사산을 밟을 수 있습니다.

VS2015에서도 작동합니다!
선사 시대 펭귄

1

라이브 서버에서 동일한 하드웨어 또는 새 컴퓨터 (클러스터)에 응용 프로그램의 다른 인스턴스를 추가 한 다음 해당 인스턴스 만 디버깅하는 것이 좋습니다. 사용자가 트리거하는 코드에 중단 점을 추가하지 않습니다. 이것이 옵션이 아닌 경우 추적을 더 추가합니다.

그러나 이것이 꼭 필요하고 솔루션 통계가 필요한 경우 요청이 IP 주소에서 오는 경우에만 중단되는 중단 점을 추가 할 수 있습니다. 검사하는 조건부 중단 점을 추가하면됩니다 HttpContext.Request.UserHostAddress. 그러나 이로 인해 응용 프로그램 속도가 상당히 느려집니다.


그것이 제가 시도한 것입니다. 문제는이 인스턴스가 동일한 도메인 (IP 또는 다른 도메인에서 실행)에서 작동하지 않아서 많은 인증서 문제 (SSL, WCF 등)로 이어지고로드가 적을 때 버그가 발생하는 상황이 발생하지 않는다는 것입니다!
Xaqron

죄송합니다, 당신이 시도한 것이 확실하지 않습니다, 조건부 중단 점을 시도 했습니까?
steinar

예, 고유성을 보장하기 위해 관리되는 ID를 기준으로 이름을 지정했습니다. 그러면 할당 된 ID를 추측하고 추측을 기반으로 조건을 설정하기가 어렵습니다. 때로는 추측이 가깝고 때로는 실을 잡는 데 오랜 시간이 걸립니다.
Xaqron

1

다른 모든 스레드를 중지하지 않으려는 경우 (요청에 응답해야하는 실행중인 응용 프로그램에 Visual Studio 디버거를 연결하는 경우) 중단 점을 자동으로 만들고 제거하는 매크로를 사용할 수 있습니다.

Visual Studio에서 멀티 스레드 프로그램을 디버깅 할 때 스택 오버플로 질문 "스텝 오버"대한 답변 에서 제안됩니다 .

그러나 링크는 한 줄씩 디버깅하는 방법 만 설명합니다. 현재 스레드에서만 멈추도록 모든 중단 점 (예 : 주어진 줄 범위에서)을 수정하도록 매크로를 수정하는 것이 좋습니다 (매우 편안하다면).


1

Visual Studio 2015에서는 이것이 약간 다르다고 생각합니다. 중단 점에서 몇 가지 사항을 변경했지만 hzdbyte (위)에서 허용되는 답변을 적용하는 방법은 다음과 같습니다.

코딩 마진의 중단 점에서 마우스 오른쪽 단추를 클릭 한 후 조건> '조건식'에서 '필터'로 변경하십시오. 그러면 ThreadId로 필터링 할 수 있습니다.

또는 중단 점 창의 중단 점에서 마우스 오른쪽 단추를 클릭 한 후> 설정> 조건 상자를 선택하고 위의 작업을 수행하십시오.


1

선의 사이드 바를 마우스 오른쪽 버튼으로 클릭하여 중단 점 조건을 설정하십시오. "조건"을 선택하고 스레드 이름과 함께 따옴표로 다음을 입력하십시오.

System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"

또는 "Threads"창에서 스레드의 "Managed ID"를 가져 와서 동일한 작업을 수행 할 수 있습니다.

System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.