올바른 시점에서 VC ++의 프로세스에 디버거를 첨부하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/663449

문제

디버깅 할 때 때로는 디버거에서 응용 프로그램을 시작하는 대신 이미 실행중인 프로세스를 첨부해야합니다.

수면 () 또는 메시지 상자 호출을 넣는 것이 일반적으로 디버거를 쉽게 첨부하는 것이 일반적입니다. 나는 이들 중 일부가 결국 소스 제어에 커밋 될 수 있다고 걱정한다.

디버거를 실행중인 프로세스에 첨부 할 수 있도록 충분한 시간을 지연 시키면서도이 상황을 피하기 위해 가장 좋은 방법은 무엇입니까?

수면이나 메시지 상자를 지키고 있습니다 #ifdef _DEBUG 한 가지 방법이지만 더 나은 방법이 있는지 궁금합니다.

잠을 자면 시간이 지남에 따라 첨부 할 수없는 문제도 있습니다. MessageBox를 사용하면 원격으로 디버깅하거나 가시가없는 GUI가없는 프로세스를 디버깅 할 수있는 문제가 있습니다 (예제 Vista에서 서비스로 실행되는 예).

도움이 되었습니까?

다른 팁

특정 지점에 디버거를 부착하려면 몇 가지 옵션이 있습니다.

가장 간단한 것은 단지 전화하는 것입니다 DebugBreak, 그것은 거의 동일합니다 __asm int 3, 다른 아키텍처에서도 작동합니다 (X64 용 MSVC는 올바르게 기억하면 인라인 어셈블리를 허용하지 않습니다). 이렇게하면 정시 디버거 창이 발생하며 등록 된 디버거 (IE Visual Studio) 중에서 선택하여 프로세스에 연결할 수 있습니다.

또는 전화를 소개 할 수 있습니다 Sleep, 디버거를 첨부 할 수있는 기회를 제공합니다. 당신은 사용해야합니다 #ifdef _DEBUG 이 주위 에이 코드가 포함 된 상태에서 실제로 배송되지 않도록하십시오.

한 가지 질문 : 왜 IDE에서 코드를 실행할 수 없습니까? 서비스 또는 IIS-로드 된 DLL 또는 이와 유사합니까?

이 경우 확인할 수 있습니다 ImageFileExecutionOptions 프로세스가 시작되는 순간에 디버거를 첨부 할 수있는 레지스트리 키.

이를 위해 CDB를 사용하는 경우 서버 또는 클라이언트로 WINDBG 인스턴스로 구성하고 그러한 방식으로 디버깅 할 수 있습니다. 과거에 WindBG를 커널 디버거로 사용하고 ImageFileExecutionOptions를 사용하여 시작 하여이 작업을 수행했습니다. ntsd -d 명명 된 프로세스와 함께. 이로 인해 WINDBG가 사용자 모드로 나뉩니다. 이것은 때때로 유용한 기술입니다.

내가 때때로 사용하는 또 다른 변형은입니다

while( !::IsDebuggerPresent() )
    ::Sleep( 100 ); // to avoid 100% CPU load

디버거를 프로세스에 부착 할 때까지 조용히 기다려야합니다.

Freddy와 Reoa는 올바른 솔루션을 가지고 있습니다. 그러나 나는 MessageBox를 사용하지 않는 이유를 추가하고 싶었습니다.

MessageBox를 표시하면 응용 프로그램이 부분적으로 중지됩니다. UI가 표시되기 때문에 메시지 펌프는 여전히 프로그램의 적어도 하나의 스레드에서 실행 중입니다. 따라서 코드가 다음 중 하나를 수행하는 경우.

  1. Windows 메시지를 통해 통신합니다
  2. 사소한 UI가 있습니다
  3. 멀티 스레드입니다

본질적으로 한 상태에서 디버거를 요청하지만 완전히 다른 상태로 프로그램에 첨부됩니다. 이것은 어리석은 상황과 버그로 이어질 수 있습니다.

우리는 최근 코드베이스를 변경하여 바로 이러한 이유로 휴식을 촉진하기 위해 메시지 상자를 표시하지 않습니다. 사소한 응용 프로그램에 대해 매우 나쁜 행동을 일으 킵니다.

'올바른 포인트'에 첨부 해야하는 것은 고통입니다 ... 한 가지 옵션은 코드에 대한 명시적인 디버그 브레인 () 명령문이 문제를 강요하고 그들을 지키는 것입니다. #ifdef _DEBUG 좋은 생각이 될 것입니다. 우리는 Debugbreak ()를 호출 할 수있는 Assert 매크로를 사용하므로 Assert (false)를 쓸 수 있습니다.

고려해야 할 또 다른 옵션은 '이미지 파일 실행 옵션'을 사용하여 디버거를 자동으로 시작하는 것입니다. 이것 좀 봐 블로그 그리고 MSDN 선적 서류 비치.

찾다:

디버그 브레이크, __debugbreak 및 친구

또는

정적 무효 TIMETOCHASE () {__ASM {int 3; }; }

__asm int 3 

이 하드 브레이크 포인트는 디버그 대화 상자를 제기하여 프로세스에 첨부 할 수 있습니다. #ifdef _debug로 랩핑하면 디버그 빌드에서만 누르십시오.

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