동일한 코드를 사용하는 4 개의 스레드가있는 응용 프로그램이 있습니다. 그러나 내가 걸을 때 다른 스레드 사이를 뛰어 넘습니다. 한 스레드에 고정하여 다른 스레드가 디버깅을 위해 무시되도록하려면 어떻게해야합니까?
동일한 코드를 사용하는 4 개의 스레드가있는 응용 프로그램이 있습니다. 그러나 내가 걸을 때 다른 스레드 사이를 뛰어 넘습니다. 한 스레드에 고정하여 다른 스레드가 디버깅을 위해 무시되도록하려면 어떻게해야합니까?
답변:
예.
스레드 창 (디버그-> Windows-> 스레드)에서 원하는 스레드를 마우스 오른쪽 단추로 클릭하고 "스레드로 전환"을 선택하십시오.
디버깅을 원하지 않는 스레드에서 "동결"을 선택하여 스레드가 실행되지 않도록 할 수도 있습니다. 그러나 그들이 일을하기를 기대한다면 그것들을 "해동"하는 것을 잊지 마십시오.
더 읽기 .
단일 스레드를 통한 단일 스테핑은 VS 2012에서 대부분 고정 된 것으로 보입니다 (아래 링크에서 볼 수있는 몇 가지주의 사항이 있음). 중단 점은 고통입니다.
이전 답변에서 언급했듯이 스레드 고정 및 해동은 일반적인 해결 방법이지만 지루하며 스레드가 고정 된 다른 스레드를 기다릴 때 중단 될 수 있습니다. 이것들은 관심있는 스레드의 위치를 잃지 않고 복구하기가 어려울 수 있습니다.
또 다른 유용한 워크 플로는 중단 점에 스레드 필터를 적용하는 것입니다.
중단 점을 작성하고 중단 점을 마우스 오른쪽 단추로 클릭 한 후 필터를 클릭하고 ThreadId = 7740 (스레드 창에서 스레드 ID)을 입력하십시오.
이것은 매우 지루할 수 있습니다.
Microsoft에 대한 제안은 다른 스레드에서 명시적인 중단 점이 발생하지 않는 한 단일 스테핑 (및 변형)을 수정하여 스레드를 전환하지 않는 것입니다. 또한 현재 스레드 ID를 필터로 사용하여 중단 점을 만들려면 바로 가기 (Ctrl-F9)를 추가해야합니다. 이렇게하면 두 번째 작업 과정이 훨씬 편리해집니다.
유용하다고 생각되면 제안을 투표하거나 자신의 제안을 추가하십시오.
코드에 조건부 중단 점을 넣고 thread.Id == [someValue]
또는 Thread.Name == "[Somename]"
중단 점 조건에 넣을 수도 있습니다 ...
간단한 경우에는 훨씬 더 빠른 해결 방법이 있습니다. Steve의 링크에서 주석을 참조하십시오.
디버거는 단계가 시작된 스레드의 단계 만 완료합니다. 따라서 중단 점에 도달하면 중단 한 후 스테핑을 시작하면 다른 스레드에서 중지하지 않아야합니다. 응용 프로그램에 다른 중단 점이 있고 다른 스레드가 하나에 도달하면 설명에 따라 혼합 스레드 상태로 디버깅됩니다
그래서 제 경우에는 다양한 스레드가 내 중단 점에 도달하기 시작했을 때 방금 찾고 있던 호출을 식별 할 때까지 몇 번 계속 계속했습니다. 그런 다음 중단 점을 제거하고 간섭없이 동일한 스레드에 남아있는 동안 나머지 코드를 밟았습니다. 나머지.
유지하려는 여러 중단 점 등이있는 경우 이는 분명히 문제가됩니다. 그러나 간단한 경우에는 다시 수행하기가 훨씬 쉽습니다.
이는 Visual Studio 2008 SP1의 매우 유사한 문제와 매우 유사합니다. SP 후 핫픽스로 수정되었습니다. 그러나 핫픽스가 코드베이스에 통합되지 않았다는 다른 증거 가 있습니다. 이 피드백 항목 도 문제였습니다. 핫픽스가 다시 통합되지 않는 것은 드문 일이 아닙니다.
적어도 내가 찾을 수있는 문제를 정확하게 설명하는 피드백 항목이 없습니다. 한 가지를 추천합니다. 이와 같은 재생 버그에 대한 일반적인 문제가 있으므로 문제를 재현하는 방법에 대한 지침과 함께이 문제를 나타내는 재생 프로젝트를 포함하는 것이 좋습니다.
문제에 대한 해결 방법이 있습니다. 디버그 + Windows + 스레드로 이동하여 디버깅하지 않으려는 스레드를 마우스 오른쪽 단추로 클릭하고 고정을 선택하십시오. 나중에 해동하는 것을 잊지 마십시오.
이러한 버그는 Visual Studio 2010 서비스 팩 1에서 다시 수정되었습니다.
Visual Studio Professional 2017을 사용하고 있으며 스레드 창을 사용하여 스레드를 선택적으로 고정 및 해동합니다. 일반적으로 동일한 코드의 여러 스레드가 있으며 다른 스레드가 아닌 고정하고 싶습니다. 고정 할 스레드의 하위 집합을 선택할 수 있기 때문에 실제로 MS 스레드 창을 좋아합니다. 스레드를 이름별로 그룹화 한 다음 나머지 스레드를 실행하면서 디버깅하는 것과 동일한 코드를 실행하는 모든 스레드를 고정시킬 수 있습니다. Erwin Mayer 확장을 사용해 보았지만 매우 잘 작동했지만 실행중인 스레드를 제외한 모든 스레드가 고정되고 디버깅이 중단 점에 도달하지 않는 경우가 있습니다. 다른 스레드가 중지되고 응용 프로그램이 중지 된 것 같습니다. 일시 중지 버튼을 누르고 스레드 창에서 스레드를 고정 해제하면 해당 문제가 해결됩니다.
5. 주위를 뛰어 넘지 않고 하나의 실을 밟습니다.
멀티 쓰레드 코드를 얼마나 자주 디버깅하고 있습니까? 첫 번째 중단 점에 도달하면 한 걸음 더 나아가서 다른 스레드의 노란색 화살표로 갑자기 중지됩니까? 예상치 못한 동작은 중단 점이 여전히 설정되어 결과적으로 발생하는 것입니다. 기본적으로 디버거는 적중 할 때마다 중단 점에서 중지됩니다. 즉, 단계를 수행하면 모든 스레드가 실행될 수 있으며 현재 스레드에서 단계가 완료되기 전에 실행중인 스레드 중 하나가이 중단 점에 도달합니다. 다음에이 상황에 도달하면 다음을 시도하십시오.
- 디버거가 전환 한 새 스레드에서 적중 한 중단 점을 비활성화하거나 삭제하십시오.
- 계속 (F5)을 누릅니다.
- 첫 번째 스레드의 첫 번째 초기 단계가 어떻게 완료되고 현재 디버깅 컨텍스트인지 확인하십시오.
- 중단 점이 삭제되거나 비활성화되었으므로 중단없이 해당 단일 스레드에서 계속 스테핑 할 수 있습니다.