문제

내 C++ 앱이 Windows에서 충돌하는 경우 유용한 디버깅 정보를 서버로 보내고 싶습니다.

Linux에서는 GNU를 사용합니다. backtrace() 기능 - Windows에 해당하는 기능이 있나요?

프로그램이 충돌한 후 유용한 디버깅 정보를 추출할 수 있는 방법이 있습니까?아니면 프로세스 내에서만 가능합니까?

("앱이 충돌하지 않도록 테스트해 보세요"라는 조언은 도움이 되지 않습니다!- 사소하지 않은 모든 프로그램에는 버그가 있습니다)

도움이 되었습니까?

해결책

함수 스택워크64 Windows에서 스택 추적을 스냅하는 데 사용할 수 있습니다.

이 기능을 사용하려는 경우 FPO를 비활성화한 상태에서 코드를 컴파일해야 합니다. 기호가 없으면 StackWalk64가 FPO 프레임을 제대로 탐색할 수 없습니다.

최상위 수준을 통해 충돌 발생 시 프로세스에서 일부 코드가 실행되도록 할 수 있습니다. __try/__except SetUnhandledExceptionFilter를 호출하여 차단합니다.이는 충돌한 프로세스 내에서 코드를 실행해야 하기 때문에 약간 신뢰할 수 없습니다.또는 내장된 Windows 오류 보고를 사용하여 충돌 데이터를 수집할 수도 있습니다.이는 손상되고 충돌된 프로세스 내에서 실행되는 코드를 추가할 필요가 없기 때문에 더 안정적입니다.서비스에 서명된 바이너리를 제출해야 하므로 유일한 비용은 코드 서명 인증서를 얻는 것입니다. https://sysdev.microsoft.com/en-US/Hardware/signup/ 자세한 내용이 있습니다.

다른 팁

Windows API 호출을 사용할 수 있습니다 MinidumpWritedump 자신의 코드를 롤하려면. Windows XP와 Vist가 모두이 프로세스를 자동화하면 가입 할 수 있습니다. https://winqual.microsoft.com 오류 보고서에 액세스하려면

또한 체크 아웃하십시오 http://kb.mozillazine.org/breakpad 그리고 http://www.codeproject.com/kb/debug/crash_report.aspx 다른 솔루션의 경우.

이 웹 사이트는 C ++ 예외 후 Win32에서 스택 검색에 대한 자세한 개요를 제공합니다.

http://www.eptacom.net/pubblicazioni/pub_eng/except.html

물론 이것은 프로세스 내에서만 작동하므로 프로세스가 종료되거나 코드가 실행되기 전에 종료되는 지점까지 충돌하면 작동하지 않습니다.

Minidump 파일을 생성합니다. 그런 다음로드 할 수 있습니다 windbg 또는 비주얼 스튜디오를하고 충돌이 발생한 곳 전체 스택을 검사하십시오.

여기에 있습니다 독서를 시작하기에 좋은 곳.

현재 stackframe 주소를 로그 파일에 덤프하는 것은 매우 간단합니다. 프로그램 결함 (예 : Windows의 인터럽트 핸들러) 또는 어설 팅에서 호출되는 기능을 얻는 것입니다. 이것은 릴리스 버전에서도 수행 할 수 있습니다. 그런 다음 로그 파일은 맵 파일과 일치하여 기능 이름이있는 호출 스택을 만듭니다.

몇 년 전에 이것에 관한 기사를 게시했습니다.

보다 http://www.ddj.com/architect/185300443

C ++/WTL 애플리케이션에서 충돌을 어떻게 처리하는지 설명하겠습니다.

먼저, 주요 기능에서는 전화합니다 _set_se_translator, 구조화 된 Windows 예외를 사용하는 대신 C ++ 예외를 던지는 함수를 전달합니다. 이 함수는 오류 코드를 가져 오며 형식 관리, 및 pexception_pointers 인수, Minidump를 작성하는 데 사용할 수 있습니다 (여기에 코드). 또한 Exception_noncontInuable_Exception 또는 Exception_Stack_overflow와 같이 보석금을 내야하는 특정 "MeltDown"오류에 대한 예외 코드를 확인할 수도 있습니다.

Minidump 파일 자체는 일반적인 프로젝트와 같이 Visual Studio에서 열 수 있으며 실행 파일을 위해 .pdb 파일을 생성하는 것을 제공하면 프로젝트를 실행할 수 있으며 충돌의 정확한 위치로 이동하여 충돌의 정확한 위치로 이동합니다. 디버거에서 검사 할 수있는 스택 및 레지스터를 통화하십시오.

런타임 충돌에 대한 콜스택(및 기타 유용한 정보)을 확보하려면 사이트의 릴리스 빌드에서도 다음을 설정해야 합니다. 왓슨 박사 (DrWtsn32.exe 실행).'크래시 덤프 생성' 옵션을 선택하면 앱이 충돌할 때 지정된 경로(user.dmp라고 함)에 미니 덤프 파일이 작성됩니다.

이것을 가져와서 서버를 구축할 때 생성한 기호와 결합할 수 있습니다(pdb 파일을 생성하려면 컴파일러/링커에서 이것을 설정하십시오. 집에 안전하게 보관하고 덤프와 일치시켜 소스를 작업할 수 있도록 사용하십시오). 충돌이 발생한 곳)

자신을 얻으십시오 바람둥이, 그것을 열고 메뉴 옵션을 사용하여 '크래시 덤프 로드'를 수행합니다.모든 것이 로드되면 '~#kp'를 입력하여 모든 스레드에 대한 호출 스택을 얻을 수 있습니다(또는 현재 스레드의 상단에 있는 버튼을 클릭).

웹 전체에 이 작업을 수행하는 방법을 알 수 있는 좋은 기사가 있습니다. 이 하나 내가 제일 좋아하는 거고 너도 그러고 싶을 거야 이것을 읽어보세요 기호를 정말 쉽게 관리하는 데 도움이 되는 방법을 이해합니다.

응용 프로그램에서 덤프 생성 프레임 워크를 설정해야합니다. 여기 당신이 할 수있는 방법입니다.

그런 다음 WindBG와 같은 덤프 분석기를 사용하여 추가 분석을 위해 덤프 파일을 서버에 업로드 할 수 있습니다.

Adplus를 사용하여 Crash Callstack을 캡처 할 수 있습니다.

Windows 용 디버깅 도구를 다운로드하여 설치할 수 있습니다.

ADPLUS 사용은 여기에 언급되어 있습니다.Adplus 사용

이것은 완전한 충돌 또는 매달린 덤프를 만듭니다. 덤프가 있으면 Windbg가 구조에옵니다. 올바른 PDB와 기호를 매핑하면 모두 덤프를 분석하도록 설정됩니다. "! Analyze -v"명령을 사용하는 것으로 시작합니다.

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