Access violation na jednym kompie - D2005

0

Piszę dość duży program i nadziałem się na problem, którego nie mogę przeskoczyć. Program ma działać na kompie 1, podłączonym przez port drukarki do specyficznego hardware'u, piszę go na kompie 2, na kórym jest Delphi 2005.

Problem polega na tym, że po pewnych (koniecznychi dużych) zmianach program zaczął sie wywalać na kompie 1, ale nie na kompie 2. Przy czym na kompie 2 nie wywala się zarówno uruchamiany z IDE, jak i bezposrednio. Na 1, oczywiscie, był startowany tylko bezpośrednio, bo nie mam tam Delphi.

W czasie uruchomień testowych na kompie 2 hardware jest emulowany wewnętrznie. Więc od paru dni szukałem bezskutecznie tym tropem - że emulacja różni się od rzeczywistości. Mimo, że jest zrobiona jak najbliżej hardwaru i dane emulowane przechodzą większość ścieżki danych rzeczywistych. Wreszcie dzis się zezłościłem, przyniosłem komp2 do hardwaru, podpiąłem, i okazało sie, że się nie wywala. Czyli problem jest specyficzny dla kompa1.

Komp1 ma WinXP SP1 i nie ma .net, komp2 ma SP2 i .net. No ale program oczywiście jest napisany jako aplikacja Win32, i nie robi jakichs rzeczy typu bo ja wiem łączenie z netem, które SP2 mógłby blokować.

Fragment kodu, gdzie pada:

procedure {nested}
   PlotLine(Display:TSpikeDisplay; CurLine:Integer; MFWidth:Integer);

var
 i,j,xpos,ypos:integer;
 RewardStartPos, ResponseStartPos:integer;
 PLCanvas:array[0..1]of TCanvas;

begin
{ line structure
  @0              spike  (to SpikeHeight-1), black
  @SpikeHeight    Response (1)               red
  @SpikeHeight+1  Reward   (1)               aqua
  @SpikeHeight+2  Separator line(1)          silver
 [@SpikeHeight+3  empty (margin) line (1)    not drawn}

    MemoSession.Lines.Add(
    '### 1' )             ;
    Application.ProcessMessages;


  PLCanvas[0]:=Display.MetaFileCanvas;
  PLCanvas[1]:=Display.Bitmap.Canvas;

    MemoSession.Lines.Add(
    '### 2' )             ;
    Application.ProcessMessages;

  RewardStartPos:=1;
  ResponseStartPos:=1;

  ypos:=Margin+2*LineHeight+1+CurLine*TraceHeight;

    MemoSession.Lines.Add(
    '### 3' )             ;
    Application.ProcessMessages;

  for i:=0 to 1 do
  begin
    PLCanvas[i].Pen.Color:=clSilver;
    PLCanvas[i].PenPos:=Point(0,ypos+SpikeHeight+2);
    PLCanvas[i].LineTo(MFWidth,ypos+SpikeHeight+2);
    MemoSession.Lines.Add(
    '### 4' )             ;
    Application.ProcessMessages;
  end;

Linijki z MemoSession służą oczywiście znalezieniu miejsca błędu.
Wywala się z Access violation po wyświetleniu '### 3' ale przed którymkolwiek '### 4'.

Czy ktoś ma pomysł o co może chodzić? Czy jest tu jakiś kod wymagający SP2 lub .net???

Aha, zainstalowanie SP2 i/lub .net na kompie 1 byłoby uciązliwe, ponieważ jest on oddalony od łącza internetowego. Ale oczywiście mogę się postarać, tylko czy warto?

0

ja bym na początek wstawił po beginie w petli taką linijkę

if (PLCanvas[i] = nil) or (not Assigned(PLCanvas[i])) then
MemoSession.Lines.Add('Pusty Canvas');

a jak to będzie OK to na czas testu zastąpił bym PLCanvas[0] Display.MetaFileCanvas a PLCanvas[1] Display.Bitmap.Canvas i zrezygnował z pętli i po prostu wpisał to dwa razy. Sprawdz też, czy Display.Bitmap <> nil i czy Display.MetaFileCanvas <> nil bo <ort>ewidętnie </ort>gdzieś tu nie ma stworzonego obiektu

0

Oba Canvasy (bitmapowy i MetaFilowy) Displaya istnieja, wiem, bo są na pewno tworzone, używane gdzie indziej (i działają), i zwalniane na pewno dopiero później. Poza tym to nie tłumaczy dlaczego chodzi na jednym kompie ( a nawet na dwóch), a na drugim (komp 1) nie.

Ale z braku lepszych pomysłów spróbuje, jak bedę przy kompie 1.

Zresztą moze to jest nadzieja, bo coraz bardziej widze, ze d2005 jest cokolwiek niedoszlifowane i podatne na magiczne sposoby :-(. A juz najgorzej jak się przy normalnej pracy (nie uruchamianiu programu) IDE się wywala... :[

//DOPISANE

zrobiłem test na jednym jeszcze kompie, chodzi. Ten ma SP2 ale nie ma .net. Czyli mogłoby to zależeć od SP2 (czemu???) ale pewnie to przypadek.

0

a jeszcze takie małe pytanko masz SP1 i SP2 do D2005?

0
Misiekd napisał(a)

a jeszcze takie małe pytanko masz SP1 i SP2 do D2005?

Nic nie instalowałem dodatkowo, ale pisze mi Borland (R) Developer Studio for Microsoft WindowsTM Version 9.0.1882.30496 Update 2 (C) Borland (R) Software Corporation

Misiekd napisał(a)

na czas testu zastąpił bym PLCanvas[0] Display.MetaFileCanvas a PLCanvas[1] Display.Bitmap.Canvas i zrezygnował z pętli i po prostu wpisał to dwa razy.

Nic nie pomogło, kurna.

0

I po raz kolejny okazało się... Wszystkim ku przestrodze:

<font color="darkblue"><font size="4">Jeśli wasz program robi kompletnie idiotyczny błąd w kompletnie dziwnych i nic nie wskazujących okolicznościach, <font color="red">NIE</span> podejrzewajcie Borlanda o bład kompilatora, <font color="red">NIE</span> podejrzewajcie, że komp/system jest zepsuty (tak jak ja podejrzewałem).
Podejrzewajcie <font color="red">SIEBIE</span> o kolejny durny błąd. Który popełniłem, wreszcie znalazłem, poprawiłem i może wreszcie nauczy mnie to pokory...</span></span>

<font size="1">BTW, w programie były dwie listy kart dźwiękowych: wszystkie obecne w systemie, oraz wybrane przez użytkownika. Błąd polegał na użyciu niewłaściwej z list w pewnym miejscu, występował na jednym kompie ponieważ na nim wybierałem do testów kartę nr 3 a na innych kartę nr 1 (bo innej nie było). Wybranie karty 1 "chowało" błąd.
Na podstawie numeru karty był ustalony Display:TSpikeDisplays (wybrany z tablicy array of TSpikeDisplays), no i odwołanie się do Canvasów nieistniejącego SpikeDisplaya gwałciło dostęp... Dodatkowo zaciemnił sprawę fakt, że po Canvasach tych rysowałem już wcześniej, ale wtedy po prostu szedłem po array of TSpikeDisplays po kolei, nie rysowałem po wybranym po numerze karty, więc błędu nie było.</span>

0

a jak 5 dni temu pisałem, żebyś sprawdził czy kanwasy są tworzone to byłeś pewny, że są i nie sprawdziłeś :P to teraz masz za swoje :D

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