2011-09-27 20 views
10

Mam problem z tym, że podczas wywoływania procedury biblioteki innej firmy proces się kończy. Nie jestem w stanie złapać tego w moim debugerze. Może to być związane z tym pytaniem: How can I debug a win32 process that unexpectedly terminates silently?.Jak określić, dlaczego mój proces kończy się

Kiedy przechodzę przez połączenie do tej biblioteki, debugowany proces kończy się. Jeśli to zakończenie było spowodowane nieobsługiwanym wyjątkiem lub naruszeniem dostępu do pamięci, debugger by go przechwycił. Tak więc domyślam się, że proces w jakiś sposób kończy się normalnie.

Co próbowałem:

  • ustawienie punktów na ExitThread i ExitProcess
  • Ustawianie teleskopowe dla nieobsłużonych wyjątków i nieważnych paramters (set_terminate i _set_invalid_parameter_handler)
  • Zmiana _set_abort_behavior i _set_error_mode.
  • Poinstruowanie debuggera, aby zatrzymał wykonywanie wszystkich wyrzuconych wyjątków.

Ale bez skutku, żaden z procedur obsługi nie jest wywoływany i żaden punkt przerwania nie jest uruchamiany.

co zaobserwowałem: Kiedy wywala proces, widzę dwie rzeczy w oknie Output debug:

  1. niezwiązanych (patrz aktualizować poniżej) widzę EEFileLoadException wyrzucane. Szybkie google tego wyjątku nie daje mi jasnej odpowiedzi na pytanie, co oznacza ten wyjątek.

    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. Kiedy kończące wszystkie wątki zwracają ten sam kod błędu (STATUS_INVALID_CRUNTIME_PARAMETER). Ten kod błędu oznacza, o ile mogę stwierdzić, że jedna z funkcji środowiska wykonawczego c otrzymała nieprawidłowy parametr, a aplikacja została zakończona ze względów bezpieczeństwa.

    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). 
    

Co naprawdę chcę wiedzieć, co jest tego przyczyną i ewentualnie; jak mogę to złapać w debugerze?

Aktualizacja Odnośnie EEFileLoadException, to w rzeczywistości rzucone przed programem sprawia, że ​​połączenia, które powoduje, że do rozwiązania, więc to nie jest związane z zakończeniem procesu.

Aktualizacja Właśnie przeczytałem, że set_terminate nie działa w debuggera więc to nie wchodzi w rachubę. I jak zauważono w moim komentarzu, programy obsługi są zarządzane na zasadzie wątku, więc nie mam dostępu do odpowiedniego programu obsługi.

Ponadto, program najprawdopodobniej ulega awarii w wątku roboczym, do którego nie mam dostępu, więc trudno jest ustawić jakiekolwiek punkty przerwania/procedury obsługi w ogóle.

Czy istnieje lepszy sposób, aby dowiedzieć się, co poszło nie tak?

+0

zdałem sobie sprawę, że funkcja obsługi kończy się nie nazywa, ponieważ są one zainstalowane na zasadzie per-wątku i nie mam dostępu do wątku upaść. –

+0

Mam sytuację podobną do tej, z wyjątkiem mojego przypadku, wiadomości TRACE również nie są dostarczane do okna wyjściowego. Kiedy zamiast tego połączyłem się z WinDebugiem, odkryłem, że było to wywołanie 'DebugBreak()', które VS ignorowało, co spowodowało, że proces sam się zakończył, powodując 'Program [0x2F74] 'OUTLOOK.EXE' został zakończony z kodem -1073740777 (0xc0000417). "Niestety, nie mogę zrozumieć, dlaczego Visual Studio ignoruje program, który powinien debugować. –

Odpowiedz

0

Uruchom debugger aplikacji nuder (lub dołącz do działającego procesu), naciśnij przycisk Ctrl+Alt+E i zaznacz pola, aby uruchomić zatrzymanie debuggera na wyjątku.

Za każdym razem, gdy wystąpi wyjątek, debugger zostanie przerwany. Będziesz mógł sprawdzić stany gwintów/stos wywołań, aby ewentualnie zidentyfikować problem.

Typowe przyczyny app nieoczekiwane rozwiązania są:

  • coś naprawdę postów WM_QUIT wiadomość i to instruuje aplikację, aby zamknąć
  • wyjątek ma miejsce, a to nie jest obsługiwane (szczególnie na tle. wątek); Wyjątkiem przemierza wezwanie stos do systemu operacyjnego i nie wie, co zrobić z wszystkich rzeczy i po prostu zabija proces

Jak EEFileLoadException wyjątek ma miejsce i nie knnow o co chodzi, to może by chcesz wiedzieć, czy jest to obsługiwane, czy nie, jeśli w rzeczywistości jest to fatalne dla twojej aplikacji.

+1

Próbowałem już poinstruować debuggera, aby zatrzymał się na wszystkich wyrzuconych wyjątkach bez powodzenia. –

+0

Nie uważam też, że "WM_QUIT" jest problemem, ponieważ aplikacja kończy działanie podczas debugowania głównego wątku. Wskazuje to na inny wątek będący winowajcą. –

+0

Czy debugger zatrzyma się na wyjątku? Jakiego typu debuggera używasz, natywny i/lub zarządzany? –

-2

Miałem do czynienia z tym samym problemem wcześniej. Właśnie usunąłem plik obj w projekcie C#. I odbuduj ponownie, a projekt zadziałał. Mam nadzieję, że rozwiąże to twój problem.

2

Skonfiguruj procdump, aby wygenerować zrzut procesu w czasie zakończenia procesu. Nie jestem pewien, czy VS2010 może otwierać pliki zrzutu, ale windbg może. Następnie zrzuć wszystkie stosy nici i powinieneś zobaczyć ten, który powoduje zakończenie. Będziesz wtedy mógł sprawdzić stos, aby znaleźć obraźliwy argument.

Jeśli aplikacja jest foo.exe następnie uruchomić procdump z wiersza polecenia takiego: procdump -ma -t -w foo.exe

-ma wskazuje pełny zrzut pamięci

-t wskazuje zapisu zrzut na zakończenie procesu

- w oznacza oczekiwanie na uruchomienie procesu, jeśli jeszcze nie działa

Następnie uruchom aplikację pod dowolnym numerem debuggera pod numerem. Po jego zakończeniu powinieneś zobaczyć dane wyjściowe z procdump wskazujące, że proces się zakończył i że zapisuje plik zrzutu.

Oto link do procdump: http://technet.microsoft.com/en-us/sysinternals/dd996900

Powiązane problemy