2008-09-30 5 views
6

우리가 개발중인 응용 프로그램에 문제가 있습니다. 아주 드물게, 100 분의 1처럼 응용 프로그램이 시작될 때 충돌합니다. 충돌이 발생하면 시스템 전체가 꺼지고 컴퓨터가 경고음을 울리고 완전히 멈추는 유일한 방법은 전원을 끄는 것입니다 (Windows XP 사용). 우리가 디버거에 침입하거나 스택 덤프가 발생할 때 생성 할 수 없다는 사실과 충돌의 희귀 성은 디버깅하기가 매우 어렵습니다.응용 프로그램에서 모든 함수 호출을 로깅/모니터링합니다.

나는 모든 함수 호출을 파일에 기록하는 무언가를 찾고있다. 그런 도구가 존재합니까? VTune과 같은 프로파일 러는 구현이 불가능해서는 안됩니다.

우리는 Visual Studio 2008 (C++)을 사용하고 있습니다.

감사합니다.

A.B.

답변

0

GCC는 모든 함수 호출 주위 __cyg_profile_func_enter 및 __cyg_profile_func_exit 호출되는 함수에 특수 호출을 방출하는 컴파일러를 알려줍니다 -finstrument-functions라는 코드 생성 스위치가 있습니다. Visual C++에는 /GH/Gh과 유사한 옵션이 있습니다. 이로 인해 컴파일러는 함수 호출을 중심으로 __penter 및 __pexit에 대한 호출을 내 보냅니다.

이러한 계측 모드는 로깅 시스템을 구현하는 데 사용할 수 있으며 컴파일러가 로컬 파일 시스템 또는 네트워크의 다른 컴퓨터로 출력하기 위해 생성 한 호출을 구현할 때 사용할 수 있습니다.

가능하면 valgrind 또는 유사한 검사 도구를 사용하여 시스템을 실행 해보십시오. 이것은 손에서 벗어나기 전에 문제를 파악할 수 있습니다.

2

로깅 아이디어를 가진 유일한 문제는 시스템 충돌, 최신 로그 항목이 여전히 캐시에있을 수 있습니다 및 ... 기회가 디스크에 기록되지해야 할 때 그것은 나를라면 그

나는 것입니다 다른 PC에서 프로그램을 실행 해보십시오. 문제가있는 하드웨어 또는 드라이버가 벗겨 질 수 있습니다. 응용 프로그램은 "시스템을 종료 할 수 없어야합니다".

2

몇 가지 아이디어 -
크래시가 발생하기 직전에 응용 프로그램에서 일종의 예외가 발생했을 가능성이 큽니다. SetUnhandledExceptionFilter()를 사용하여 처리되지 않은 모든 예외에 대한 처리기를 설정하고 스택 추적을 로그 파일에 기록하면 작동중인 크래시를 잡을 수 있습니다.
모든 쓰기 후에 파일을 플러시하는 것을 잊지 마십시오.

또 다른 옵션은 모든 시스템 호출을 커널에 기록하는 strace과 같은 도구를 사용하는 것입니다 (여러 가지 맛과 구현이 있으므로 원하는 것을 선택하십시오). 크래시 직전의 로그를 보면 범인을 찾을 수 있습니다.

+0

스트레인트 링크에 ​​감사드립니다. – Constantin

3

로깅 기능 항목/종료는 문제에 대한 낮은 수준의 접근 방식입니다. 자동 디버거 계측을 사용하는 것이 좋습니다 (이미지 파일 실행 옵션에서 디버거 키를 사용하여 regedit를 사용하거나 아래 링크를 제공하는 패키지의 gflags 사용). 충돌이 발생할 때까지 문제를 재현하려고합니다.또한 스크립트를 사용하여 의심되는 모듈의 호출 기록을 디버거가 기록하도록하거나 다른 정보를 수집 할 수 있습니다.
그러나 응용 프로그램의 세부 사항을 알지 못하면 솔루션을 제안하는 것이 매우 어렵습니다. 사용자 앱, 서비스 또는 드라이버입니까? "시작시 충돌"은 Windows 시작 또는 응용 프로그램 시작시 무엇을 의미합니까?
문제를 해결하려면 debugger package을 사용하십시오.

2

네트워크를 통해 두 번째 컴퓨터를 원격 디버거로 사용 해본 적이 있습니까? 응용 프로그램 (및 시스템)이 충돌 할 때 문제의 실제 지점이 아니라면 두 번째 시스템에 유용한 정보가 표시되어야합니다. VC++에는 적어도 일부 버전에서는 그러한 능력이 있다고 생각합니다.

관련 문제