2010-11-23 17 views
5

Mam kilka "rogue" wywołanie OutputDebugString w mojej aplikacji, która wypisuje "T", ale nie mogę po prostu zlokalizować.Debugowanie wywołań OutputDebugString w Delphi

Czy można w jakiś sposób ustawić punkt przerwania w funkcji OutputDebugString i sprawdzić, skąd jest wywoływany?

używam Delphi 2009.

Odpowiedz

13

Ile wzywa do OutputDebugString istnieją w projekcie? Możesz użyć okna "Znajdź w plikach", aby znaleźć je wszystkie, a jeśli nie jest ich zbyt wiele, nie powinno być problemu.

W przeciwnym razie możesz - oczywiście - użyć wyszukiwania i zastąpić wszystkie OutputDebugString( za pomocą raise Exception.Create(.

Można również napisać funkcję

procedure OutputDebugString(const Str: string); 
begin 
    raise Exception.Create(Str); 
end; 

w jednostce używanej przez każdą inną jednostką w projekcie. Jeśli tylko ta nowa jednostka zostanie zadeklarowana po Windows.pas na liście uses, ta nowa funkcja zostanie użyta zamiast tej z Windows.

Aktualizacja

Tak, można umieścić punkty przerwania wewnątrz Windows.pas. Najpierw w projekcie przejdź do Opcje projektu, aw obszarze Debugowanie wybierz "Użyj debugujących modułów DCU". Następnie można przejść do Windows.pas i umieścić punkt przerwania na linii 30769:

procedure OutputDebugString; external kernel32 name 'OutputDebugStringW'; 
+1

Zbyt wiele elementów projektu i komponentów. Nie jestem nawet pewien, czy wiadomość pochodzi z kodu własnego czy zewnętrznego. – Harriv

+0

Tak, debugowanie DCU to robi. Teraz po prostu muszę dowiedzieć się, jak ustawić warunek .. – Harriv

+2

jeśli to nie twój kod, ale jakaś jednostka, której używasz (pośrednio) to połączenie może również przejść do OutputDebugStringA. – Remko

7
  • Uruchom aplikację.
  • Połóż to na chwilę.
  • Okno Otwórz okno widoku/Debuguj okna/moduły .
  • Wyszukaj plik kernel32.dll. Kliknij dwukrotnie.
  • Wyszukaj OutputDebugStringA. Podwójnie kliknij.
  • Otwiera się okno procesora. Ustaw punkt przerwania na w pierwszej linii.
  • Wyszukaj OutputDebugStringW. Podwójnie kliknij.
  • Otwiera się okno procesora. Ustaw punkt przerwania na w pierwszej linii.

Gotowe.

Teraz każde wywołanie OutputDebugString z aplikacji zostanie przerwane w punkcie przerwania. Można również włączyć rejestrowanie właściwości punktów przerwania w celu zalogowania się do stosu wywołań.