문제

우리는 코드베이스에는 여러 해 동안,모든 개발자는 사라 졌어요.그것은 사용하는 많은,많은 스레드가 있지만,없는 명백한 디자인이나 일반적 건축 원칙이 있습니다.모든 개발자는 자신의 스타일의 멀티스레드 프로그래밍,그래서 어떤 쓰레드와 통신을 중 하나를 사용하여 다른 큐,일부 잠금 데이터와 함께 뮤텍스,일부 잠금을 가진 세마포어,어떤 사용하여 운영-시스템 IPC 메커니즘에 대한 내부 프로세스 커뮤니케이션.이 없는 디자인 문서 및 주석은 있습니다.그것은 혼란,그리고 그것 때마다 우리는 시도하는 리팩터 코드 또는 새로운 기능을 추가,우리가 소개하는 교착 상태 또는 기타 문제를 예방해야 합니다.

그래서,사람을 알아의 모든 공구 또는 기술하는 것이 도움을 분석하고 모든 문서의 상호 작용 사이 스레드가?FWIW,codebase C++리눅스에서,그러나 내가 듣고 관심을 위한 도구에 대해 다른 환경이다.


업데이트

감사 응답을 받은 지금까지,하지만 난 뭔가를 기대 더 정교한 체계적인 보다는 조언은 본질적으로 추가"로그온 메시지,무슨 일이 일어나고 있는지 알아 내에서,그리고 그것을 해결합니다." 거기에 많은 도구가 있을 분석하고 문서화하 제어 흐름에서 하나의 스레드 프로그램은 거기에 아무것이 가능한 멀티 스레드 프로그램?


또한 참조 다중 스레드 응용 프로그램 디버깅

도움이 되었습니까?

해결책

투자의 사본에서는 인텔 VTune 과 실 프로파일링 도구입니다.그것은 당신에게 두 시스템 및 소스 레벨의 스레드니다.그것은 확실히 하지 않 autodocument 당신을 위한 것지만,실제 도움이 될 이상에서 시각화에서 무엇이 일어나고 있는 서로 다른 상황이다.

가 있다고 생각 시험 버전을 다운로드할 수 있습니다,그래서 그 가치가있을 수 있습 제공합니다.나는 사용된 Windows 버전만,VTune 웹 페이지에 그것은 또한 리눅스 버전입니다.

다른 팁

시작점으로,나는 유혹을 추가하는 추적 로그 메시지의 전략적 포인트에서 당신의 응용 프로그램입니다.이할 수 있는 방법을 분석하기 위해 귀하의 스레드가와 상호작용 위험이 없는 행동 관찰하는 스레드가 변경됩니다 그들의 행동(수로의 경우 단계별 디버깅).내 경험을 가진.NET 플랫폼 및 내 선호하는 로깅 도구는 것 log4net 그것은 무료이기 때문에,광범위한 구성 옵션과는 경우에,당신이 현명한 방법을 구현하는 로깅,그것은 눈에 띄게 방해해서는 응용 프로그램의 성능을 제공합니다.또한,있습니다.NET 의 내장에서는 디버그(또는)클래스에서는 시스템입니다.Diagnostics 네임스페이스가 있습니다.

나에 초점을 공유 메모리 잠금 먼(뮤텍스와 세마포어)그들은 대부분의 문제를 일으킬 가능성이.에서 보는 상태가 보호되었으로 잠그고 다음을 결정하는 상태에서는 보호의 여러 잠급니다.이를 통해의 잠재적 충돌이 발생합니다.보에는 상황는 코드를 잠금을 보유하고 전화하는 방법을 잊지 않는다(가상 방법).을 제거하려고 이러한 호출 가능한 경우(시간을 줄여 자물쇠가 개최되).

주어진 목록하는 뮤텍스가 개최되고 거친의 아이디어 국가는 그들을 보호 할당을 잠그기 위해(즉,mutex 는 항상 취해야 하기 전에 mutex B).을 적용하는 이에 코드입니다.

당신이 결합 할 수 있습니다 여러 가지로 자물쇠 중 하나는 경우 동시지 않을 것이다 불리하게 영향을 받습니다.는 경우,예를 들어,mutex A 와 B 처럼 보이 있을 수 있습니다 그들은 교착 상태 및 순서 방식은 쉽지 않게 할,결합하는 하나의 잠금을 처음.

그것은 쉽게 될 것이지만 나를 단순화하는 코드의 비용으로 동시성의 핸들을 얻는 문제입니다.

이는 정말 힘든 문제에 대한 자동화된 도구입니다.당신 모드로 설정할 수 있습니다 모델 검사 귀하의 코드입니다.기대하지 않는 마법의 결과는:모델 체은 매우 제한된 양의 코드 및 스레드의 수를 그들이 효과적으로 확인합니다.

는 도구는 당신을 위해 일할 수 있습니다입니다 체스 (지만 그것은 불행하게도 Windows-만). 또 다른 매우 강력한 도구지만,매우 어려운 사용 및 처리하지 않을 수 있습니다 C++.Wikipedia 나열 증기, 내가 전에 들어 본 적이없는,하지만 같은 소리 그것은 당신을 위해 일할 수 있습니다:

스팀 모델 검사를 위한 C++.그것은 감지하는 교착 상태,segmentation faults,범위 변수들과 종료되지 않습니다.

또한,그것은 아마 많은 도움이려고 수렴하는 코드로는 소수의 정의(그리고,바람직하게는,높은 수준)의 동기화 방식.혼합 잠금,세마포 및 모니터링에서 동일한 코드 기반이라고 생각하고 있었습니다.

중 하나 이상을 유지해야 한다는 것과 마음을 사용하여 log4net 또는 이와 유사한 공구는 그들이 변경의 타이밍 응용 프로그램 및 수 있는 근본적인 경쟁 조건입니다.우리는 몇 가지 잘못 작성된 코드를 디버깅을 도입한 로깅 및 이를 실제로 제거 레이스 상태,교착 상태(또는 크게 감소하의 주파수).

자바에서,당신은 선택과 같은 FindBugs(바이트 코드는 정적분석)어떤 특정한 종류의 일치하지 않는 동기화,또는 많은 동적 실 분석기 같은 회사에서 Coverity,JProbe,OptimizeIt,etc.

할 수 없는 UML 도움 당신은 여기 있는가?

는 경우 리버스 엔지니어링의 codebase 로 UML, 에,당신은 그릴 수 있어야 클래스 다이어그램을 표시하는 간의 관계 당신의 클래스입니다.에서 시작하는 클래스의 방법은 스레드 엔트리 포인트를 당신이 볼 수있는 스레드를 사용하는 클래스입니다.내 경험을 바탕으로 함 합리적인 로즈, 이 될 수 있을 사용하여 드래그-앤-드롭;지 않으면 사이의 관계를 추가한 클래스고 이전의 것들,그래에 직접 사용하는 쓰레드로 시작하는 방법을 시작으로 다이어그램.이해 당신에게 힌트로의 역할은 각 스레드입니다.

이것은 또한 표시"데이터를 객체는"공유되는 개체들이 있는 실정.

만약 당신이 그 큰 클래스 다이어그램을 제거하는 모든"데이터를 객체를"그럼 당신은할 수 있어야 하는 레이아웃이어그램이 구름으로 각각 구름되고 스레드 또는 그룹 스레드의하지 않는 한,결합 및 응집 코드의 기준은 끔찍합니다.

이 것이 아니라 하나는 부분의 퍼즐이지만,그것은 도움이 될 수 있다;나는 그냥 바랍 codebase 지 진흙 투성이나 너무"절차상의"어떤 경우에는,...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top