2011-09-27 2 views
10

타사 라이브러리 루틴 호출 중에 프로세스가 종료되는 문제가 있습니다. 내 디버거에서 이것을 잡을 수 없다. 이 질문과 관련된 것일 수 있습니다 : How can I debug a win32 process that unexpectedly terminates silently?.프로세스가 종료되는 이유를 결정하는 방법은 무엇입니까?

이 라이브러리를 호출 할 때 디버깅되는 프로세스가 종료됩니다. 이 종료가 처리되지 않은 예외 또는 메모리 액세스 위반으로 인한 것이면 디버거가이를 잡았을 것입니다. 그래서 가장 좋은 추측은 프로세스가 어떻게 든 정상적으로 종료된다는 것입니다.

은 내가 시도하는 것 : _set_abort_behavior_set_error_mode 변경되지 않은 예외 무효 paramters (set_terminate_set_invalid_parameter_handler)

  • 에 대한 핸들러를 설정

    • 설정 ExitThread에 중단 점 및 ExitProcess
    • 합니다.
    • 모든 예외에서 실행을 중단하도록 디버거에 지시합니다.

    그러나 아무 소용이 없으면 아무 핸들러도 호출되지 않고 중단 점이 트리거되지 않습니다. 내가 관찰 한 내용을

    : 프로세스 충돌, 나는 디버그 출력 창에 두 가지를 볼 때 이 : 관련되지

    1. (아래 업데이트 참조) 내가 볼 EEFileLoadException가 발생된다. 이 예외에 대한 빠른 google은이 예외를 의미하는 명확한 대답을 제공하지 않습니다. 종료되면

      First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: EEFileLoadException at memory location 0x0030b5ac.. 
      First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.. 
      First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.. 
      First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: 0xE0434352: 0xe0434352. 
      
    2. 는 모든 스레드가 동일한 에러 코드 (STATUS_INVALID_CRUNTIME_PARAMETER)를 반환한다. 이 오류 코드는, 알 수있는 한, 런타임 기능 중 하나가 유효하지 않은 매개 변수를 수신했으며 응용 프로그램이 보안 상 이유로 종료되었음을 의미합니다.

      The thread 'Win32 Thread' (0x12c0) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0xe04) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x53c) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x116c) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x16e0) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x1420) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x13c4) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x40c) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0xc78) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0xd88) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x16c8) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0xcb8) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x584) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x1164) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x1550) has exited with code -1073740777 (0xc0000417). 
      The thread 'Win32 Thread' (0x474) has exited with code -1073740777 (0xc0000417). 
      The program '[5140] Program.exe: Native' has exited with code -1073740777 (0xc0000417). 
      

    는 내가 정말 알고 싶은 것은이 발생하고 선택적 것입니다; 디버거에서 이것을 어떻게 잡을 수 있습니까?

    업데이트 EEFileLoadException에 관해서는, 그것은이 프로세스의 종료와 관련되지 않도록,이 종료의 원인이되는 호출을 프로그램하기 전에 발생 사실이다.

    업데이트 난 그냥 그 질문에서 그래서 set_terminate 디버거에서 작동하지 않습니다 읽어 보시기 바랍니다. 그리고 내 의견에 언급 한 바와 같이 핸들러는 스레드별로 관리되므로 관련 처리기에 액세스 할 수 없습니다.

    또한 프로그램에 액세스 할 수없는 작업자 스레드에서 충돌이 발생할 가능성이 높으므로 중단 점/처리기를 전혀 설정하기가 어렵습니다.

    잘못된 점을 파악하는 더 좋은 방법이 있습니까?

  • +0

    나는 그들이 스레드 단위로 설치하고 난 충돌 스레드에 액세스 할 수 없습니다 때문에 종료 핸들러가 호출되지 않습니다 것을 깨달았다. –

    +0

    내 경우를 제외하고 TRACE 메시지가 출력 창으로 전달되지 않는 것과 비슷한 상황이 발생합니다. 대신 WinDebug로 연결했을 때, VS가 무시하고있는 DebugBreak() 호출이 있다는 것을 알았습니다. 프로세스가'terminate()'를 일으켜'프로그램 [0x2F74] 'OUTLOOK.EXE'가 종료되었습니다 코드 -1073740777 (0xc0000417)으로 .' 불행히도 Visual Studio에서 디버깅 할 프로그램을 무시하는 이유를 알 수 없습니다. –

    답변

    0

    응용 프로그램 누더 디버거를 실행하거나 실행중인 프로세스에 연결하고 Ctrl+Alt+E을 누르고 상자를 선택하여 디버거가 예외 실행을 중지하도록합니다.

    예외가 발생할 때마다 디버거가 중단됩니다. 문제를 식별 할 수 있도록 스레드 상태/호출 스택을 확인할 수 있습니다.

    • 뭔가 정말 게시물 WM_QUIT 메시지와 해당 예외가 발생
    • 을 닫으려면 응용 프로그램을 지시, 그리고 ESP 배경에 (처리되지 않습니다 예기치 않게 종료 할 수있는 응용 프로그램에 대한

      일반적인 이유가 있습니다. 실); 예외 호출이 OS를 쌓을 통과하며 모든 물건을 어떻게 해야할지하지 않고 예외가 발생하고 당신이 그것에 대해, 당신은 아마도 것입니다 무엇 knnow하지 않는

    EEFileLoadException으로 그냥 프로세스를 종료 실제로 그것이 처리를 위해 치명적인 것이면 처리되거나 아닌지 먼저 이해하고 싶습니다.

    +1

    나는 던져진 모든 예외에서 멈추도록 이미 디버거에게 지시했다. –

    +0

    또한 메인 스레드를 디버깅하는 동안 앱이 종료되기 때문에'WM_QUIT'가 문제라고 생각하지 않습니다. 이것은 범인 인 다른 스레드를 가리 킵니다. –

    +0

    디버거가 예외로 중지합니까? 어떤 종류의 디버거를 사용하고 있습니까? –

    -2

    나는 전에도 같은 문제에 직면했다. 방금 C# 프로젝트에서 obj 파일을 삭제했습니다. 다시 재건하면 프로젝트가 효과가 있습니다. 희망이 당신의 문제를 해결할 것입니다.

    2

    프로세스 종료 시간에 프로세스 덤프를 생성하도록 procdump를 구성하십시오. VS2010이 덤프 파일을 열 수 있지만 windbg은 열 수 있는지 확실하지 않습니다. 그런 다음 모든 스레드 스택을 덤프하면 종료가 발생한 스택이 표시됩니다. 그런 다음 스택을 검사하여 잘못된 인수를 찾을 수 있습니다. procdump -ma -t -w foo.exe

    -ma가 프로세스 종료

    에 쓰기 덤프를 나타냅니다 -t 전체 메모리 덤프

    을 나타냅니다 : - 앱에서 foo.exe 경우

    는 다음과 같은 명령 프롬프트에서 procdump을 실행 이미

    를 실행하지 않는 경우 w 그런 다음 외부 응용 프로그램 어떤 디버거의을 당신을 실행하는 과정이 출시 될 때까지 기다릴 나타냅니다. 프로세스가 종료되면 프로세스가 덤프 파일을 작성하고 있음을 나타내는 procdump의 출력을 확인해야합니다.

    여기 링크가 procdump 할 수있다 : http://technet.microsoft.com/en-us/sysinternals/dd996900

    관련 문제