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

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

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

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



답변

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

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

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

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

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

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


답변

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

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

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

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

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


답변

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

표시

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

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

풍모

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

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


답변

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

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

답변

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

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

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


답변

VS 2019에서 :

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

답변

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

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