2009-07-18 3 views
26

그 외의 경우에는 문제가 발생하지 않았지만 (지금은 한두 주 동안이 특정 응용 프로그램을 사용하고있었습니다) VS 재현기에서 응용 프로그램을 실행 중이라고 가정 할 때 재현 할 수 있는지 여부는 알 수 없습니다 어떻게 된 후에 교착 상태를 디버깅해야합니까? 프로그램을 일시 중지하고 다른 스레드가 발생했을 때의 위치를 ​​확인하면 호출 스택을 얻을 수 있다고 생각했지만 일시 중지를 클릭하면 응용 프로그램이 죽을 때까지 Visual Studio가 교착 상태에 빠졌습니다.교착 상태를 디버깅하는 방법은 무엇입니까?

잠재적 인 문제를 찾기 위해 내 소스 트리를 탐색하는 것 외에 다른 방법이 있습니까? 문제가 어디서 발생했는지를 호출 스택에서 처리 할 수 ​​있습니까? 도움이 될만한 다른 도구/팁/트릭이 있습니까?

답변

9

올바른 방법은 무엇입니까? Visual Studio에도 교착 상태가 발생하면 지금과 마찬가지로 발생합니다. 다른 문제가 없다면 그것은 불행입니다.

디버거에서 응용 프로그램을 실행하지 않아도 디버깅 할 수 있습니다. 응용 프로그램을 정상적으로 실행하고 교착 상태가 발생하면 VS를 나중에 연결할 수 있습니다. Ctrl + Alt + P, 프로세스를 선택하고 디버거 유형을 선택하고 을 입력하십시오.을 클릭하십시오. 다른 종류의 디버거 유형을 사용하면 VS 충돌의 위험을 줄일 수 있습니다 (특히 원시 코드를 디버깅하지 않는 경우)

교착 상태에는 2 개 이상의 스레드가 포함됩니다.응용 프로그램에서 교착 상태를 감지 한 첫 번째 UI 스레드 (아마도 UI 스레드)를 알고있을 것입니다. 이제 다른 하나만 찾아야합니다. VS 모든에 작동하지 않는 경우 아키텍처의 지식, 그것을 쉽게 찾을 수 있어야한다 (예를 들어, 다른 스레드가 UI 등과 상호 작용, 같은 잠금 장치를 사용하여 무슨 일이)

, 당신은 항상 windbg를 사용할 수 있습니다 . 여기에서 다운로드하십시오 : http://www.microsoft.com/whdc/devtools/debugging/default.mspx

0

당신은 인텔 (R) 패러렐 인스펙터와 같은 다른 프로그램을 사용할 수 있습니다 :
http://software.intel.com/en-us/intel-parallel-inspector/

이러한 프로그램이 잠재적 교착 상태에 당신에게 당신의 코드에서 장소를 표시 할 수 있습니다. 그러나 비용을 지불하거나 평가 기간에만 사용해야합니다. 이와 같은 무료 도구가 있는지 여부를 모릅니다.

+0

C/C++도 마찬가지입니다 (관리되는 C가 없으므로 관리되지 않습니다.). –

3

나는 다음과 같은 순서로 서로 다른 접근 방식을 시도 할 것 : 다시 시도 할 것이다 당신의 중요한 영역은 다른 함수를 호출하지 않는 것이

- 첫째는, 확인하고, 스레드 안전 위반을 찾기 위해 코드를 검사 중요 영역을 잠글 수 있습니다.

스레드 활동을 시각화하는 데 필요한 도구를 사용하여 우리가 만든 OS 로그를 구문 분석하고 스레드가 선점 될 때 모든 컨텍스트 스위치와 그래프를 보여주는 사내 펄 스크립트를 사용합니다.

- 좋은 도구를 찾을 수없는 경우 교착 상태가 발생하기 전에 실행 중이던 마지막 스레드를 보려면 일부 로깅을 수행하십시오. 이렇게하면 문제가 발생할 수있는 위치에 대한 단서가 생깁니다. 잠금 메커니즘에 고유 한 이름이있는 경우 개체에 자체 스레드가 있거나 고유 스레드를 관리하기위한 전용 세마포 또는 뮤텍스를 만드는 것처럼 도움이됩니다.

이 정보가 도움이되기를 바랍니다. 행운을 빕니다!

+0

로깅에 대한 메모에서 log4net을 올바르게 사용하는 법을 배워야합니다. –

0

어디서나처럼 모든 교착 상태를 잡을 수있는 "실버 글 머리 기호"도구가 없습니다. 서로 다른 스레드가 자원을 확보하여 순서가 위반 된 위치를 찾는 순서에 관한 것입니다. 일반적으로 Visual Studio 또는 다른 디버거는 스택 추적을 제공하므로 불일치가있는 위치를 찾을 수 있습니다. DevPartner Studio는 교착 상태 분석을 제공하지만 지난 번에 너무 많은 가양 성이 존재한다는 것을 확인했습니다. 일부 정적 분석 도구는 잠재적 인 교착 상태도 발견합니다.

이외의 경우 자원 획득 순서를 적용하기 위해 아키텍처를 직접 얻는 데 도움이됩니다. 예를 들어 계층화는 상위 수준 잠금이 하위 수준 잠금보다 먼저 수행되지만 콜백은 조심해야합니다.