2009-07-28 10 views
10

W Delphi 2009, mój program generuje teraz błąd "List index out of bounds". Generuje okno podręczne:Jak znaleźć lokalizację błędu "List index out of bounds" w Delphi

alt text http://www.beholdgenealogy.com/img/boundserror.gif

używam "Debug" Build Configuration, który cały Runtime error checking włączone. Ale to nie przechwytuje błędu, zanim się to stanie.

Czy istnieje prosty sposób zlokalizowania źródła tego błędu w moim programie bez konieczności wstawiania punktów przerwania i zawężania go metodą prób i błędów?

+1

Innym +1 do przepełnienia stosu, na zapewnienie forum i innych ekspertów, którzy pomogli mi szybko ominąć problem, że nie miałby łatwo znaleźć rozwiązanie na mój posiadać. – lkessler

+1

Uzgodnione. Po prostu nie rozumiem, dlaczego moje głosowanie w górę doprowadza to pytanie do zera. Dobrze napisany, ładny zrzut ekranu i dobre odpowiedzi. Po prostu nie rozumiem. – Argalatyr

+3

Zgaduję, że jeśli chciałbym awansować, powinienem zapytać: "Jaka jest twoja ulubiona kreskówka z Delphi". Na szczęście wszystko, czego chciałem, było rozwiązaniem mojego problemu. – lkessler

Odpowiedz

10

Czy włączono opcję "Zatrzymaj w Delphi Exceptions"? (Narzędzia \ Opcje debuggera \ Wyjątki językowe [Delphi7]) W przeciwnym razie nie ulegnie on uszkodzeniu w kodzie źródłowym.

Upewnij się również, że EListError nie znajduje się na liście "Listy wyjątków do Ignorowania". Ta lista znajduje się również w Tools \ Debugger Options \ Language Exceptions (Delphi 7).

+0

To jest kolejna (powstała po Alexanderzie) wersja prostej odpowiedzi, której szukałem. Sprawdzę to, kiedy wrócę dzisiaj do domu. – lkessler

+1

Według SO odpowiedziałem godzinę wcześniej;) i nie widziałem odpowiedzi Alexandersa, kiedy pisałem. Tak, byłem pierwszy: P –

+0

Interesujące. Musi to być strefa czasowa, której SO się myli. Mówi, że odpowiedziałeś 14 godzin temu, a Alexander odpowiedział 13 godzin temu. Ale kiedy najpierw sortuję najstarsze, twoja przychodzi naprzód, więc musiałaś być pierwsza. – lkessler

0

Jakieś wskazówki, co robi twoja aplikacja, kiedy to nastąpi? Długa pętla? Kliknięcie przycisku?

Kiedy aplikacja zatrzymuje się i patrzysz na okno debugowania stosu połączeń, czy możesz prześledzić połączenie z ostatniego połączenia z twojego kodu? Stos wywołań nie określi wszystkich warunków, ale może zawęzić lokalizację.

Po zawężeniu połączenia może okazać się przydatne narzędzie do rejestrowania, takie jak CodeSite. Na przykład często loguję zmienne sterujące w pętli, aby ustalić, która iteracja występuje przed błędem, a następnie jest to kwestia zidentyfikowania prawdopodobnych podejrzanych.

+0

Wiem, że jest to błąd wykraczający poza ramy jednej z wielu TLists, z których korzysta mój program lub składnik w moim programie. Jestem zaskoczony, że sprawdzanie granic nie łapie tego. Aplikacja nie zatrzymuje się. Kontynuuje po naciśnięciu przycisku OK, ale brakuje niektórych funkcji. Gdybym mógł znaleźć połączenie, wtedy będę wiedział, gdzie jest błąd. Ale znalezienie połączenia jest trudne. – lkessler

+1

Sprawdzanie obwiedni nie zostanie wykryte, ponieważ sprawdzanie ograniczeń dotyczy operacji arytmetycznych (przepełnienie). Masz na myśli sprawdzanie zasięgu, ale sprawdzanie zasięgu * nie może * go przechwycić, ponieważ dotyczy to tylko tablic, a nie klas. Komunikat o błędzie, który widzisz, jest wynikiem "sprawdzania zasięgu" klasy listy. –

+0

Czy możesz dodać przycisk i dołączoną metodę, która wyświetla wartość od każdego z Twoich TLists? Być może ten, który się nie pokazuje, to ten, który umarł? Czy to zawęziłoby to? Zgadzam się, że ostatecznie może być mniej pracy, aby zapoznać się z narzędziem do debugowania JCL, madExcept lub EurekaLog, ponieważ odpowiednie narzędzie znajduje wiele zastosowań ... – Argalatyr

9

madExcept (bezpłatnie) lub EurekaLog (płatny) może pomóc. Możesz je skonfigurować, aby wyświetlać/wysyłać e-mailem śledzenie stosu, gdy wystąpi błąd. Używam EurekaLog we wszystkich moich projektach i jest to nieocenione przy naprawianiu tego rodzaju rzeczy.

+2

FYI madExcept jest dostępny tylko do użytku niekomercyjnego. –

+0

Zakładam, że któryś z tych programów (nigdy ich nie próbowałem) zadziała. Są jednak nieco przesadzone, jeśli nie chcę dodawać rozszerzonego raportu o błędach do mojego pakietu dystrybucyjnego. Mogę pójść z jednym z nich (jakieś zalecenia, co jest lepsze?), Ale naprawdę liczyłem na prostsze rozwiązanie. – lkessler

+3

JCL ma podobną ofertę i jest naprawdę bezpłatny. –

3

Ponieważ jest to błąd RTL/VCL, często kończy się lepszym zachowaniem łamania/wywoływaniem kalendarza, jeśli włączysz debugowanie DCU (i przebudujesz).

+0

Nie trzeba tego wypróbowywać (patrz rozwiązanie powyżej), ale dzięki za pomysł. – lkessler

7

Hej, nie potrzebujesz żadnych dodatkowych narzędzi do śledzenia tego! :)

Wystarczy uruchomić aplikację pod debugger i upewnij się, że „Stop na Wyjątki Delphi” (czy jak to się nazywa w swojej wersji Delphi) jest włączona NA.

Po wystąpieniu wyjątku - pojawi się powiadomienie z debuggera. Naciśnij przycisk "OK"/"Debuguj" i po prostu przejrzyj stos połączeń. Okno stosu połączeń wyświetlane jest automatycznie w najnowszej wersji Delphi. Jeśli go nie widzisz - przejdź do "Widok"/"Debuguj system Windows"/"Stos połączeń".

To wszystko. The call stack will point you at the exact location of the problem. Nie potrzeba dodatkowego narzędzia.

Te narzędzia (EurekaLog, JCL lub madExcept) są potrzebne, jeśli rozpowszechniasz swój program wśród użytkowników i chcesz zbierać raporty o błędach po stronie klienta. To znaczy. nie ma debuggera, aby sprawdzić problem.

+1

Widzę również dziwne niestandardowe słowo w podpisie: "Oto";) – Alex

+0

Mam nadzieję, że "Patrz" wkrótce będzie standardem. :-) – lkessler

+0

To jedna z wersji prostej odpowiedzi, której szukałem. Sprawdzę to, kiedy wrócę dzisiaj do domu. – lkessler

0

dla listbox, tstrings, ... oznacza, że ​​indeks znajduje się poza listą-> liczba,. . przykład tString-> strnigs [?]; [?] to < 0 lub> (tString-> count-1) spowoduje błąd poza granicami.

jak dla NMPop3, itp., ... jeśli używasz pop3client do pobierania wiadomości e-mail, ma ona błędy do jakiegoś unix /? serwer pop3, , z którym się zetknąłem, aby pobrać wiadomość e-mail z poczty.???.com, ale w porządku z niektórymi.

nareszcie muszę przepisać moją aplikację pop3client na tclientsocket zamiast tnmpop3. działa teraz z każdym serwerem pop3, z którym się łączyłem.

nadzieja ta pomoc & powodzenia

Powiązane problemy