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
iExitProcess
- 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:
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.
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?
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ść. –
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ć. –