Access violation - jak znaleźć w kórym miejscu w kodzie występuje?

0

Hej Koledzy,

mam pytanie Access violation - Jak znaleźć w którym miejscu w kodzie występuje?
Podczas pracy aplikacji po kliku dniach lub po paru msc - występuje Access violation.

Podpowiedzcie proszę w jaki sposób mogę odnaleźć dokładnie w której linijce kodu wystąpił błąd. Albo jak to odszukać lub co dodać do kodu programu żeby to później znaleźć.
Dziękuje.

screenshot-20240314173513.png

1

Odpal debugera, crash jest w momencie dostępu czyli praktycznie ostatnia instrukcja.

Kod skompiluj z symbolami debuggera, to będzie ci łatwiej bo każda instrukcja assemblera będzie mapowana do konkretnej linijki kodu.

2

jeśli to bardzo rzadki wyjątek pomyśl o użyciu narzędzia do tego przeznaczonego, np. mad Except https://www.madshi.net/madExceptDescription.htm
po odpowiednim skonfigurowaniu dostaniesz na maila zrzut ekranu plus dużo informacji dotyczącej wyjątku. Oczywiście trzeba je umieć interpretować ale na pewno są to cenne dane.

3

Najpierw zbuduj projekt w trybie przyjaznym debugowaniu, czyli z symbolami debuggera oraz bez agresywnych optymalizacji, a następnie odpal program z poziomu IDE, czyli z działającym debuggerem. Kiedy program spowoduje jakikolwiek błąd (runtime error lub exception), to wyskoczy okienko błędu z informacją o tym w czym tkwi problem, a po jego zamknięciu IDE podświetli linijkę w kodzie, która błąd spowodowała.

Wykonanie programu cały czas będzie wstrzymane, więc będziesz mógł użyć narzędzi debuggera do sprawdzenia np. zmiennych, parametrów, call stacku itd., a dzięki nim zawsze masz możliwość znalezienia przyczyny w kilka sekund. Jeśli chcesz sprawnie uprawiań programowanie i likwidować istniejące w nim błędy, to poświęć jeden wieczór i pobaw się ficzerami debuggera w IDE. Bez jego znajomość, szukanie błędów będzie trudne i czasochłonne.

Natomiast kiedy będziesz potrzebował skompilować release dla ludzi, to użyj buildu bez symboli debuggera i bez ficzerów przydatnych do debugowania (testowania zakresów, asercji, czyszczenia pamięci zmiennych itd), a także z agresywnymi optymalizacjami.


robertz68 napisał(a):

jeśli to bardzo rzadki wyjątek […]

Access Violation to bardzo częsty wyjątek i dytyczy odwołania się do nieprzydzielonej procesowi pamięci. Powodowany jest albo przez dereferencję znilowanego wskaźnika lub referencji, albo podczas dereferencji wskaźnika lub referencji obiektu, które wskazują na zwolniony blok pamięci lub zwolniony obiekt. 😉

0

@furious programming bardzo Ci dziękuje, natomiast ten program musi być uruchomiony na kliku maszynach, czyli bez delphi'ego:P więc jak się pojawi bład w exe'ku to chciałbym wiedzieć z czego on wynika i jaka cześć kodu / marker za to odpowiada i jak odczytać marker w kodzie.

Program jest na zdalnej maszynie (zdalny pulpit) więc muszę umieć jakoś odczytać błąd i wiedzieć jak go później po tym błędzie/marekrze znaleźć w kodzie.

Da się tak?
dziękuje

0

To zrzuć sobie call stack do logu, kiedy walnie wyjątkiem. Ale zbuduj program tak czy siak w ze wszystkimi ficzerami debugowania, tak aby mieć komplet informacji dotyczących stosu wywołań.

1

MadExcept albo EurekaLog. Osobiście używam MadExcept i sprawdza się bardzo dobrze

0

Dziękuje @abrakadaber . EurekaLog wygląda najprzyjaźniej dla Mnie, pytanie gdzie kupić najtaniej :) ? i czy warto kupić wersje Enterprise - przyda Mi się to ?

0

a potrzebujesz kod źródłowy? Nie wiem czy dostaniesz taniej niż na stronie

0

Jak odpalisz program w gdb, to włączając tui enable włączysz wyświetlanie kodu źródłowego, który jest mapowany z formatu dwarf symboli debuggera.

Teraz możesz się down i up przeskakiwać ramki, każda funkcja to inna ramka na stosie, mozesz do góry i na dół chodzić między funkcjami.

Możesz użyć p nazwa_zmiennej żeby sobie podejrzeć jaki był adres pointera przed próbą uzyskania dostępu.

Access violation tak na oko wydaje mi się, że program zaalokował stronę pamięci dał jej uprawnienia typu czytanie, pisanie, egzekucja i jakiś brakowało, a program to spróbował zrobić, jeśli by strona nie istniałą to by pewnie poleciało segmentation fault exception.

ja bym użył do szukania problemu x64dbg albo gdb, łatwo się w nich poruszać, a x64dbg od razu ci pokazuje strony pamięci, otwarte uchwyty, api systemowe itp.

0

@Autysta ty w ogóle czytasz posty przed odpisaniem czy piszesz co akurat wydaje ci się, że wiesz na dany temat??? - Podczas pracy aplikacji po kliku dniach lub po paru msc

1

@pahacfd:

  1. klikasz w linka https://www.eurekalog.com/buy.php?promo=TAF70H7FC8B8196924C4A64D815973E16BA70F
  2. zakładasz konto
  3. kupujesz wersje profesjonalną
  4. instalujesz
  5. Wyklinujesz Project -> Eureka log options -> Add eurekalog to this project
    screenshot-20240315105028.png
  6. Zaznaczasz "save bug report to file"
    screenshot-20240315105330.png
0

Możesz skorzystać z kodu promocyjnego do zakupu EurekaLog z polecenia. Sam używam od wielu lat EL w tym obecnej wersji.
https://www.eurekalog.com/buy.php?promo=TAF192HEDBA124688AB328FBE878A9038A9139C

1

Nie wiem jak we FP ale jak chodzi o Delphi to wszystko wbudowany debugger wszystko załatwi bez dodatkowych kosztów tylko trzeba by klientom dać wersję debug to przy dobrej współpracy przy raportowaniu błędów idzie się wszystkiego dowiedzieć ewentualnie można napisać własną obsługę błędów która będzie robiła zrzuty do pliku.

2
pahacfd napisał(a):

EurekaLog wygląda najprzyjaźniej dla Mnie, pytanie gdzie kupić najtaniej :) ?

Ale naprawdę?

i czy warto kupić wersje Enterprise - przyda Mi się to ?

Raczej na pewno nie.
Tylko po co Ci w ogóle EurekaLog?

Nie możesz po prostu użyć np. tego:
https://github.com/grijjy/JustAddCode/tree/master/ErrorReporting

Ale poważnie... Jest sporo podobnych rozwiązań, kilka OpenSource - jak to wyżej.
Nie sądzę aby wydawanie kasy na Eurekę było tu absolutnie konieczne.

Poza tym logger pewnie się jeszcze przyda do śledzenia aktywności tej apki, np. taki:
https://github.com/grijjy/GrijjyCloudLogger

0

W process explorer, otwierasz go, szukasz, zamykasz proces, kompilujesz swój program.

1 użytkowników online, w tym zalogowanych: 0, gości: 1