8

Zastanawiam się, czy możliwe było skonfigurowanie debuggera Visual Studio 2008 do zatrzymania wykonywania, gdy wątek wychodzi z dokładnym kodem błędu (lub przynajmniej dowolną niezerową wartością). Moja aplikacja używa olbrzymiej liczby wątków, więc nie można ich wszystkich śledzić ręcznie.Czy jest możliwe złamanie wyjścia wątku z określonym kodem błędu?

Czy istnieje sposób, aby powiedzieć VS2008, aby złamać, gdy DOWOLNY wątek w programie uderzy "exit (X);" (X różni się od 0) i wyświetla źródło?

Odpowiedz

3

Tak, ustaw punkt przerwania w funkcji [email protected] i dodaj warunek *(int*)(ESP+4) == 42, aby sprawdzić, czy kod zakończenia jest określoną wartością (42, w tym przykładzie); w przypadku programów 64-bitowych należy użyć ESP+8 zamiast ESP+4.

Jeśli jednak wątek zakończył się powracaniem z głównej procedury wątku (zwykły przypadek) zamiast bezpośredniego wywoływania ExitThread lub jednego z jego wrapperów, to nie będziesz mieć żadnych informacji o tym, czym był ani co spowodował ten wątek aby wyjść poza stanem wyjścia i identyfikatorem wątku.

Uwaga: Nazwa funkcji [email protected] jest szczegółem implementacji, który może ulec zmianie w przyszłych wersjach systemu Windows; [email protected] to nazwa w systemie Windows 7. Aby dowiedzieć się, jaka jest rzeczywistość w twoim systemie, uruchom dumpbin /exports C:\Windows\system32\kernel32.dll i wyszukaj nazwę, do której są przypisane mapy ExitThread.

+0

Znalazłem, że ustawienie punktu przerwania w '_RtlExitUserThread @ 4' nie działa, ponieważ funkcja nie została rozpoznana. Jednak ustawienie punktu przerwania w 'kernel32! ExitUserThread' działało. –

Powiązane problemy