IT story

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

hot-time 2020. 4. 10. 08:22
반응형

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. 이제 다른 스레드를 중단하지 않고 중단 점에 도달하지 않고 디버깅 할 수 있습니다

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


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

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


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

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

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


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

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

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


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

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

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

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

참고 URL : https://stackoverflow.com/questions/5304752/how-to-debug-a-single-thread-in-visual-studio

반응형