2017-01-31 4 views
2

몇 분 동안 응답하지 않는 응용 프로그램의 스택 추적을 캡처하고 싶습니다.Windbg 침입 시간이 매우 오래 걸림

응용 프로그램이 응답을 멈 추면 Windows 바탕 화면은 이미 실행중인 다른 응용 프로그램이 정상적으로 작동하더라도 마우스 클릭에 대한 응답을 중지합니다 (예 : windbg가 제대로 작동하고 ProcessExplorer가 화면을 새로 고치지 만 마우스에 응답하지 않음 이벤트). 응용 프로그램이 응답하지 않는 동안 실제로 하나의 CPU 코어의 약 80 %를 차지합니다. 그래서 스택 트레이스를 얻고 싶습니다.

는 오작동 응용 프로그램에는 일반적으로 이상한 일을 2 ~ 3 분 정도 소요 또는 Ctrl + Esc를 누르면 즉시 응답하지 (및 시작 메뉴는 물론 열립니다 ...)

나는 WinDbg는 첨부 오작동하는 응용 프로그램과 Break 명령을 실행하면 응용 프로그램이 다시 응답하기 시작할 때까지 침입이 발생하지 않습니다.

침입이 사실은 DbgBreakPoint을 호출하는 원격 스레드를 실제로 생성한다는 것을 알고 있습니다.

디버거의 스레드가 실행되지 않도록 할 수있는 기능은 무엇입니까?

수정 : 먼저 도움을 주셔서 감사합니다.

나는 또한이 문제가 잘못된 장치 드라이버 나 어딘가에 시스템 전체에 걸려있는 것을 설치하는 것으로 인해 발생할 수 있다고 생각했습니다.

나는 커널 디버깅을 활성화하고 문제가있는 스레드에 대해 커널에서 스택 추적을 얻거나 수동 블루 스크린 트리거가 덤프를 생성하고 나중에 그 패턴을 볼 수 있도록 할 생각을하고있었습니다.

프로세스 탐색기와 프로세스 모니터는 흥미로운 것을 나타내지 않습니다. 또한 버그가 트리거되면 (창을 업데이트하지만 마우스 또는 키보드에 반응하지 않음) 버그를 사용할 수 없게됩니다.

EDIT2

: 배경 정보 : 응용 프로그램은 QT, OpenGL은 또한 DirectSound를 사용 및 Windows 7 SP1 x64의 나는 현재 그래픽 부분에 무언가를 의심하고 실행됩니다.

이상한 점은 시스템 전반의 잠금 (GDI 잠금과 같은)을 취하면 다른 Windows의 그리기를 막을 수 있지만 이상한 일은 아닙니다. 동일한 컴퓨터의 WinDbg도 정상적으로 작동합니다. ProcessExplorer는 업데이트하지만 마우스 클릭, 데스크톱 업데이트는받지 만 마우스 클릭은받지 못합니다.

나는 현재 커널 디버거가 붙어있다 ...

EDIT3 ETW는 디버깅을 위해 가장 유용했다. Qt의 메인 이벤트 처리 루프가 미쳐 버렸습니다. PeekMessage 및 MsgWaitForMultipleObjectsEx (0 제한 시간 포함)는 긴밀한 루프에서 호출됩니다. 이것이 바로 높은 CPU 사용량의 출처입니다. 그 때 응용 프로그램이 많은 양의 메시지를 생성/가져 오는 것 같습니다. 그러나 메시지가 무엇인지 (또는 ETW의 함수 매개 변수에 액세스하는 방법을 알지 못하는지) 알기 란 쉽지 않습니다. 디버거를 사용하면 많은 도움이되지 않지만 QT의 이벤트 루프에 중단 점이 있으면 WM_TIMER 메시지가 범인이라고 생각하게됩니다.

+0

Windows 버전 어떤 것을 볼 수 있도록 WAIT (µs) max을 찾기 위해? 이 버전 또는이 모든 경우에만이 기능을 사용할 수 있습니까? – RbMm

+0

Windows 7 sp1 x64, 일부 구성 요소는 Windows 7에서만 인증되므로 다른 버전에서는 테스트하지 않았습니다.이 문제는 쉽게 재현 할 수 없습니다. 2 시간 사용 후 발생할 수 있습니다 (이것은 dodgy 드라이버 이론과 일치합니다). – Jaka

+0

WPA/ETW를 사용해 보셨습니까? – magicandre1981

답변

2

이 시간 동안 데스크탑이 오작동하는 것을 감안할 때, 앱이 오작동이 아니어도 다른 곳의 버그를 악화시키는 것처럼 들릴 수 있습니다 (예 : 장치 드라이버 나 다른 맬웨어 방지 코드에서 프로세스). 앱에서 스택 추적은 매우 드러나거나 그렇지 않을 수도 있습니다.

문제가 쉽게 재생성 될 수있는 경우 앱의 "중간"에 중단 점을 설정하고 그 전후에 문제가 발생하는지 확인합니다. 그런 다음 중단 점을 이동하면 앱이 사기성을 갖기 전에 앱이 실행하는 마지막 명령을 찾을 수 있습니다. 이 동작을 유발하는 앱의 모습을 파악하면 어떤 일이 벌어지고 있는지 알 수 있습니다.

또 다른 옵션은 일부 시스템 전체 디버깅 도구를 사용해보십시오. 첫째, 이벤트 뷰어에서 정점에 도달하여 의심스러운 오류나 경고 이벤트가 기계가 헤이 와이어가되는 순간 가까이에 게시되는지 확인합니다. 그런 다음 Sysinternal의 프로세스 모니터 또는 프로세스 탐색기와 같은 도구를 사용하여 상황을보다 잘 파악할 수 있습니다. 또한 ETW를 사용하여 시스템에서 일어난 일들에 대한 시스템 전체 추적을 캡처 한 다음 사실을 조사 할 수도 있습니다. (ETW는 사용하기가 어려울 수 있으므로 Bruce Dawson의 UIforETW를 확인하십시오.)

+0

ETW를 상기시켜 줘서 고마워. 커널 디버거보다 쉽게 ​​관리 할 수 ​​있습니다 :) (firewire 어댑터 등은 없습니다.) – Jaka

+0

또한이 특정 문제에 대해 잊어 버린 경우 ... 나는 어떤 종류의 시스템 전체 잠금 (또는 비슷한 것)을 알고 싶어합니다.) 디버거가 실행되는 원격 스레드를 방지 할 수 있습니까? 어떤 아이디어? – Jaka

+1

@Jaka - 이것은 win32k.sys 하위 시스템의 일부 버그와 관련이있을 수 있습니다. 말하자면 APC를 사용하지 않고 시스템 전체 리소스를 확보하고이 리소스를 획득 한 스레드를 일시 중단합니다. 결과적으로이 리소스를 얻으려고 할 때 모든 GUI 스레드가 중단 될 수 있습니다. 몇 년 전에 내가 xp에서 이런 식으로 보았다 - 만약 gui 쓰레드가 멈추었을 때, 포커스를받는 과정에서 – RbMm

1

ETW를 사용하여 원인을 찾습니다. Windows Performance Toolkit (Win10 v1511 SDK의 일부인 Win32에서 작동하는 마지막 버전 인 https://go.microsoft.com/fwlink/p/?LinkID=698771)을 설치하고 WPRUI.exe를 실행 한 다음 CPU Usage을 선택하고 Start을 클릭합니다.

행 아웃을 캡처 한 후 Save을 클릭하십시오. WPRUI가 끝날 때까지 기다렸다가 WPA에서 ETL을 엽니 다. setup and load debug symbols in WPA

드래그 & 드롭

CPU Usage (Precise) 그래프 창을 분석하고 프로세스가 long hang and expand the stack to see where it happens.

관련 문제