2011-03-14 4 views
194

일부 프로젝트에 대한 해결책이 있습니다. 서로 다른 프로젝트에는 몇 가지 단점이 있습니다. 첫 번째 스레드가 이러한 중단 점 중 하나에 도달했는지 추적하고 다른 스레드가 동일한 코드 블록을 입력 했음에도 불구하고 해당 단일 스레드를 계속 추적하려고합니다.Visual Studio에서 단일 스레드를 디버깅하는 방법?

중단 점, 즉 스레드 이름 = ... 또는 스레드 ID = ...에 조건을 정의하는 것이 가능하다는 것을 알고 있지만 내 경우에는 부하가 많이 걸린 ASP.NET 응용 프로그램이고 첨부하는 즉시 w3wp.exe 많은 스레드가 중단 점에 도달합니다. ThreadLocal<break-point>과 같은 것이 필요합니다.

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

+0

왜로드가 심한 서버에서 디버깅을 시도하고 있습니까? – Paolo

+5

@Paolo :이 웹 응용 프로그램은 대규모 웹 팜의 심장부로 작동하며 시나리오 테스트에서 모방하기는 어렵습니다. – Xaqron

+5

* [Visual Studio에서 멀티 스레드 코드를 디버깅하기위한 5 가지 팁] (http://devpinoy.org/blogs/jakelite/archive/2009/01/10/5-tips-on-debugging-multi-threaded) -code-in-visual-studio-net.aspx) *. – noproblem

답변

110

다른 스레드가 코드를 실행하지 않기 때문에 고정/고정 스레드가 잘못된 방법입니다. 중단 점 창에서

  1. 히트 Ctrl + A는 (모든 브레이크 포인트를 선택) :

    가장 정확하고 유용한 방법이다.

  2. 마우스 오른쪽 버튼으로 클릭하고 "필터 ..."를 선택하십시오.
  3. "ThreadId = (현재 스레드 ID)"를 입력하십시오.

비주얼 스튜디오 2015 및 새로운에서, 과정은 비슷하다 중단 점 창에서

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

그래서 모든 스레드가 실행되지만 디버거는 현재 스레드에서만 실행됩니다.내가 사용했던

+1

정확히 무엇이되어야 하는가 (여전히 ThreadId가 필터로 필요함)가 아니라 기존 옵션으로 가장 정확한 솔루션입니다. – Xaqron

+21

이렇게하면 "단계"디버거 명령이 다른 스레드로 들어가는 것을 막을 수 있습니까? 그게 큰 문제 였어. 나는 실마리를 밟고 있는데 갑자기 완전히 관련이없는 코드 부분에 빠져있다. Visual Studio에서 더 이상 개발하지 않으므로 테스트 할 수 없습니다. –

+4

중단 점 창에서 마우스 오른쪽 버튼을 클릭해도 "필터"명령이 없으며 어쨌든 현재 스레드 ID를 어떻게 알 수 있습니까? - 직접 창으로 가서'System.Threading.Thread.CurrentThread.ManagedThreadId' 또는 무엇인가를 타이핑 할 것입니까? – BrainSlugs83

1

동일한 하드웨어 또는 새 시스템 (클러스터링)에서 라이브 서버에 다른 응용 프로그램 인스턴스를 추가 한 다음 해당 인스턴스 만 디버깅 할 것을 제안합니다. 사용자가 트리거하는 코드에 중단 점을 추가하지 않겠습니다. 그게 옵션이 아니라면, 나는 더 많은 추적을 추가 할 것이다.

그러나 이것이 절대적으로 필요하고 솔루션 통계가 필요한 경우 요청이 IP 주소에서 오는 경우에만 중단되는 중단 점을 추가 할 수 있습니다. HttpContext.Request.UserHostAddress을 검사하는 조건부 중단 점을 추가하여이 작업을 수행 할 수 있습니다. 그러나 이렇게하면 응용 프로그램이 상당히 느려집니다.

+0

그게 내가 시도한거야. 문제는이 인스턴스가 동일한 도메인 (IP 또는 다른 도메인에서 실행 중임)에서 작동하지 않고 SSL (Secure Socket Layer), WCF, ...와 같은 많은 인증서 문제로 이어지고 버그가있는 상황이 발생하지 않는다는 것입니다. – Xaqron

+0

죄송합니다. 이들 중 어느 것을 시도했는지 확실하지 않습니다. 조건부 중단 점을 시도해 보셨습니까? – steinar

+0

예, 고유성을 보장하기 위해 관리 ID를 기반으로 이름을 지정했습니다. 그런 다음 어떤 Id가 할당되었는지 추측하고 추측을 기반으로 조건을 설정하는 것은 어렵습니다. 때때로 추측은 가깝고 때로는 스레드를 잡는 데 오랜 시간이 걸릴 수 있습니다. – Xaqron

284

는 여기에 내가했던 일이야 :

  1. 설정 내가 는 내가 찾던 스레드 에 칠 줄 알았 조건부 중단 점.

  2. 중단 점 적중되면

    하고 비주얼 스튜디오 스레드 창에서 원하는 스레드에있는 (동안 디버깅, 디버그 -> 윈도우 -> 스레드), Ctrl 키 + (모든 스레드를 선택합니다) , Ctrl + 현재 접속중인 대화 목록을 클릭하십시오. 디버그 할 스레드를 제외한 모든 스레드를 선택해야합니다.

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

이제 Visual Studio는 해동 된 스레드를 통해서만 단계를 밟습니다. 이 작업을 수행 할 때 훨씬 느려지는 것 같습니다. 아마도 고정 된 모든 스레드를 반복해야하기 때문입니다. 그러나 다중 스레드 디버깅에 약간의 온건함이 있습니다.

+44

이것은 대답으로 표시되어야합니다 – Diego

+0

그냥 내가 뭘 필요! 고맙습니다! – KTF

+1

다른 스레드에서 실행되는 약 8 개의 작업이있는 컨텍스트에서이 작업이 작동하지 않습니다. 다른 모든 스레드를 멈추고 "건너 뛰기"하지만 IDE는 잠시 멈추고 다른 스레드로 점프합니다. –

1

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

이것은 an answer to Stack Overflow question "Step over" when debugging multithreaded programs in Visual Studio에서 제안됩니다.

그러나 링크는 줄 단위로 디버깅하는 방법 만 설명합니다. 매크로를 수정하여 (예를 들어 주어진 라인 범위에서) 모든 중단 점을 현재 스레드에서만 중지하도록 수정하는 것이 좋습니다.

12

방금 ​​찾고있는 것을 수행하는 Visual Studio 2010+ 확장을 방금 출시했습니다. 그리고 그것은 무료입니다 :).

프리젠 테이션

이 비주얼 스튜디오의 확장이 바로 가기 및 도구 모음 단추는 멀티 스레드 애플리케이션을 디버깅하는 동안 개발자가 쉽게 하나의 스레드에 집중할 수 있도록 추가합니다.

수동으로 스레드 창으로 이동하여 모든 스레드를 고정/해동 할 필요가 없지만 따라야하는 스레드는 수동으로 이동해야하므로 생산성이 향상됩니다.

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

official page 또는 Github repositoryhere on the Gallery 그것을 확인하십시오.

+0

사용중인 VS의 버전은 무엇입니까? –

+0

확장 프로그램을 설치했지만 제대로 작동하지 못했습니다 (현재 프로젝트의 경우 VS2010을 사용함). [그런데 스레드가 생성 될 때 스레드가 활성 상태로되는 것이 문제라고 생각하는 방식으로, 이는 아마도 표준 동작이므로 이전 주석을 제거했습니다]. – wil

+0

나는 이것을 조사 할 것이다. 지구상에서 마이크로 소프트의 가장 큰 디버깅 오류 중 하나를 해결하려고 시도한 유일한 사람 일 수 있습니다. – stu

8

약간 다른 접근 방식 :

  1. 정상적인 중단 점을 만들고 당신이 현재 디버깅있어 관리되는 스레드 ID에 대한 귀하의 스레드 창에서
  2. 봐 충돌하자 xxx는 2
  3. 에서 스레드 ID입니다
  4. 오른쪽
  5. 가 ThreadId = XXX를 입력 중단 점 창 selecter 필터에 중단 점을 클릭 이제 다른 스레드를 중단하지 않고 중단 점을 치지 않고 디버그 할 수 있습니다.

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

+1

+1. "이것은 두 번째 스레드가 중단 점에 도달하기 전에 시간이 있다고 가정합니다." 자물쇠에 세미콜론을 싸서 세미콜론에 중단 점을 넣습니다. 중단 점이 처음 히트되면 중단 점을 비활성화합니다. 자물쇠 때문에 다른 스레드가 들어올 수 없습니다. 'lock (m_someObject) {; }' – bluedog

6

웹 응용 프로그램과 같이 여러 스레드가 생성되는 경우 @MattFaus 응답이 작동하지 않습니다. 내가 한 일은 다음과 같습니다.

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

    :

+0

모든 최상위 서버를 읽으면서이 해결 방법이 유용했습니다. –

0

나는이 그들은 중단 점에서 몇 가지를 변경 한 비주얼 스튜디오 2015에서 약간 다릅니다 만, 여기 (위) hzdbyte에서 허용 대답을 적용하는 방법을 생각한다 오른쪽 클릭> 조건> '조건식'에서 '필터'로 변경하십시오. 그러면 ThreadId로 필터링 할 수 있습니다.

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

관련 문제