Autor Beitrag
tmzll
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 02.01.14 10:01 
Hallo,

ich hoffe, ich habe die richtige Ecke erwischt, ich bin mir nicht ganz sicher, wohin dieses Thema gehört.

Unser Kunde hat uns eine in VB.net geschriebene Assembly zur Verfügung gestellt. Über diese können wir mit dem ERP Systems des Kunden in gewissem Umfang interagieren, um Aufträge abzurufen, Lagerbestände abzugleichen, etc. etc. Diese Bibliothek ist Pflicht und muss benutzt werden. Da Delphi 2010 in der Lage ist, .net Assemblies zu verwenden fiel die Wahl für unsere Software auf Delphi, da wir hauptsächlich nur Delphi Programm im Einsatz hatten. Die .net Bibliothek muss auf dem zuständigen Rechner installiert werden, bevor sie verwendet werden kann und läuft auf .net 3.5.

Die Software läuft seit Anfang 2012 zuverlässig und gut, letztes Wochenende hat mein Kollege auf dem Server, auf welchem das Programm läuft, ein Update eingespielt welches (unter anderem) .net 4 beinhaltete und den Server in unser Active Directory gezogen. Und schon war es vorbei.

Wenn ich jetzt eine Liste von Belegen anfrage, bekomme ich zunächst ein einwandfreies Responseobjekt mit Status, eventueller Fehlermeldung, und einem Datenobjekt als Property. Wenn ich jetzt dieses Attribut verwende (und wenn es nur Assigned(list) ist um auf NULL zu checken) schmeißt mir das Programm eine AccessViolation um die Ohren. Das passiert auch, wenn die Software auf einem Windows Server 2008 R2 läuft, sie funktioniert aber einwandfrei auf meinem Windows 7 x64 Rechner. Deinstallation von .net 4 war nicht hilfreich, ich weiß so langsam nicht mehr was ich ausprobieren soll... Ich habe die angebotene Assembly zum Testen auch mal in ein C# Projekt eingebunden, diese Test-Anwendung läuft auf allen Servern wunderbar.

Wie würdet ihr an die Fehlersuche herangehen? Bei diesen Systemnahen Sachen bin ich ehrlich gesagt ziemlich aufgeschmissen, in den Systemlogs von Windows ist auch nichts zu finden.

Gruß,
Tim


TL;DR
Delphi 2010 Software auf Windows Server referenziert .net Assembly
Kommunikation über WCF funktioniert soweit gut
Beim Versuch auf die Daten eines bestimmten Response-Objektes zuzugreifen: Access Violation
Problem erst seit Umstellung auf Active Directory und Installation von .net 4
Software läuft z.Zt. ausschließlich auf einem Windows7 64
Hilfe
vagtler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 96
Erhaltene Danke: 24


Delphi 2010, C# (VS 2012), Objective-C, Java
BeitragVerfasst: Do 02.01.14 14:25 
Was mir jetzt aus der Beschreibung nicht ganz klar geworden ist:

Reden wir jetzt von einer Win32-VCL-Anwendung (also Delphi) oder von einer .NET-Anwendung (Delphi for .NET respektive Delphi Prism aka RemObjects Oxygene)?
tmzll Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 02.01.14 14:39 
Hallo vagtler,

wir reden von einer Win32-VCL-Anwendung, ich habe die .net Assembly im RAD Studio über den Assistenten mit "Komponente" -> "Komponente importieren" -> ".NET-Assembly importieren" eingebunden.
vagtler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 96
Erhaltene Danke: 24


Delphi 2010, C# (VS 2012), Objective-C, Java
BeitragVerfasst: Do 02.01.14 14:46 
Und wenn Du jetzt noch etwas Code und den Inhalt der Fehlermeldung posten könntest? Idealerweise habt Ihr natürlich MadExcept oder ähnliches eingebunden...
tmzll Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 02.01.14 15:31 
user profile iconvagtler hat folgendes geschrieben Zum zitierten Posting springen:
Und wenn Du jetzt noch etwas Code und den Inhalt der Fehlermeldung posten könntest? Idealerweise habt Ihr natürlich MadExcept oder ähnliches eingebunden...


Da hast du durchaus recht, entschuldige bitte. Code ist etwas schwierig, da die Bibliotheken, wie schon erwähnt, von unserem Kunden sind, aber ich versuche es mal so mit einem kurzen Teststub:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
procedure TForm3.Button1Click(Sender: TObject);
var
  request: GetListOfVouchersRequestInterOp;
  response: GetListOfVouchersResponseInterop;
  client: _XXXXServiceClientInterOp;
  BelegNummer: String;
begin
  Memo1.Lines.Add('Erstelle Client');
  client := CoUrsaServiceClientInterOp_.Create();
  try
    Memo1.Lines.Add('Registriere');
    client.Register(GetEnvironmentVariable('ComputerName'));
    request := CoGetListOfVouchersRequestInterOp.Create();
    request.user := buildCredentials();
    Memo1.Lines.Add('Frage Liste an');
    response := client.getListOfVouchers(request);
    Memo1.Lines.Add('Überprüfe Status');
    if (not response.Fault.IsError) then
    begin
      Memo1.Lines.Add('Nullcheck');
      if (Assigned(response.VoucherList)) then  // Hier fliegt der Fehler
        Memo1.Lines.Add('Ist nicht Null')
      else
        Memo1.Lines.Add('Ist Null');
      Memo1.Lines.Add('Bereite Liste vor');
      response.VoucherList.MoveFirst();
      Memo1.Lines.Add('Iteriere durch Liste');
      while (not response.VoucherList.EOL) do
      begin
        Memo1.Lines.Add('Zeile gelesen');
        BelegNummer := response.VoucherList.Item[''].BelegNummer;
        response.VoucherList.MoveNext;
      end;
    end
    finally
      Memo1.Lines.Add('Fertig');
    end;
  end;


Zur Fehlermeldung:
Zugriffsverletzung bei Adresse E8000000. Schreiben von Adresse E8000000.

Generell weiß ich, dass Ferndiagnose hier schwer bis unmöglich ist. Ich weiß aber nicht einmal, wo ich überhaupt zu suchen anfangen soll. Ich danke dir schon mal für deine Zeit!

Edit: Ich weiß, dass die Fehlermeldung wahrscheinlich nicht tief genug geht, komme ich da eventuell "näher dran"? Auf meinem Rechner läuft die Software ja dummerweise, das heißt ich müsste notfalls Remote-Debuggen?
vagtler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 96
Erhaltene Danke: 24


Delphi 2010, C# (VS 2012), Objective-C, Java
BeitragVerfasst: Do 02.01.14 16:06 
Tatsächlich wäre mehr Tiefgang wünschenswert und hilfreich - so ist das noch nicht einmal mit der berühmten Kristallkugel erfolgversprechend...

Schon einmal versucht - wie oben schon einmal erwähnt - mit z.B. MadExcept mehr Informationen über den Fehler zu erlangen?

Überhaupt sind das alles sehr spärliche Informationen...

Um was für ein Objekt handelt es sich bei der VoucherList? Und wie muss ich mir die Systemarchitektur vorstellen? Wo wird das ERP betrieben? Entfernt? Stellt das ERP dann Webservice-Methoden bereit, die über die VB.NET-Assembly angesprochen werden? Oder wie, oder was macht die VB.NET-Assembly? Wieso ist die überhaupt für den Zugriff auf das ERP notwendig?
tmzll Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 02.01.14 16:22 
Für Mad Except müsste ich meinen Chef dazu bekommen, die Lizenz zu kaufen. Da muss ich erst nachhaken.

Diese VoucherList ist ein (wohl von denen selbst entwickeltes) Objekt aus der Schnittstelle. Das ERP-System liegt bei unserem Kunden, je nach Auftragslage schreiben wir einige Dinge damit (auf deren Wunsch) direkt in ihr System. Das Ganze sieht mir nach einem gekapselten WCF aus, die Dokumentation sagt lediglich "Ruf diese Methode auf, die macht dann xyz". Aber an die Entwickler vom Kunden brauche ich mich nicht zu wenden, da die Bibliothek an sich ja funktioniert (eingebunden in z.B. C#). Ein Zugriff über z.B. SOAP wäre mir wesentlich lieber gewesen, war aber so von unserem Kunden auch nicht vorgesehen.

Das Problem ist hauptsächlich, dass ich als Java Entwickler eingestellt bin und viel Delphi-Legacy Code vor mir habe. Das Programm sollte "noch in die alte Struktur" passen, bevor ich mit einer Umstellung anfangen sollte. Ich habe in Delphi aber definitiv nicht genug Background um zu wissen, was hier beim Referenzieren von .net Assemblies passiert, ob er diese wrappt, konvertiert, etc. Ich sehe nicht mal eine klare Struktur, auf welchem Rechner es läuft. Auf dem Server 2003 auf dem es mal lief läuft es nicht mehr, seit dieser im Active Directory hängt. Auf unseren 2008 R2 läuft es nirgendwo. Auf meinem Windows 7 Professional 64 Bit läuft es aber problemlos.
vagtler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 96
Erhaltene Danke: 24


Delphi 2010, C# (VS 2012), Objective-C, Java
BeitragVerfasst: Do 02.01.14 16:31 
MadExcept kannst Du mit der freien Version auch 30 Tage zur Evaluation nutzen.

Dass VoucherList ein Schnittstellenobjekt ist, sehe ich auch am Code. Aber was genau ist das? Es könnte bei den Methoden ja auch ein Remote DAO sein, genauso aber auch eine lokale In-Memory-Liste.

Wenn das ERP beim Kunden liegt, dann muss doch der Kommunikationsweg dokumentiert sein, oder nicht? Schließlich müsst Ihr ja u.U. entsprechende Ports freischalten in der Firewall, oder nicht?
tmzll Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 06.01.14 09:19 
Hallo,

vielen Dank für den Tipp mit MadExcept, es hat mir sehr geholfen (wenn auch anderes als gedacht).
Ich konnte damit den Fehler durch die Module der Kunden-Bibliotheken tracken und habe festgestellt, dass "Version 1.0.0" und "Version 1.0.0" scheinbar nicht der selbe Programmstand sind. Wie das durcheinandergekommen ist und wo ich den veralteten Installer (mit der selben Versionsnummer) her hatte, man weiß es nicht. Auf jeden Fall läuft der Test-Stub schon mal auf einem Server, auf dem er vorher noch nie gelaufen ist.

Ich danke dir für deine Geduld!

Gruß,
Tim
vagtler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 96
Erhaltene Danke: 24


Delphi 2010, C# (VS 2012), Objective-C, Java
BeitragVerfasst: Mo 06.01.14 09:34 
Na, dann ist doch super.

Übrigens würde ich eine Anschaffung der Vollversion von MadExcept jeder professionellen Softwareschmiede ans Herz legen. Günstiger bekommt man kaum eine solch solide Fehlersuchhilfe... ;)

(Und nein, ich bekomme *keine* Provisionen... :p)
tmzll Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 06.01.14 09:41 
Nuja, "professionelle Softwareschmiede" ist zu viel gesagt. Wir entwickeln interne Software, sind ein Industriebetrieb. Aber ich habe die Anschaffung dieses Tools schon angesprochen, alleine schon wegen dem bekannten Dialog "Ich hatte hier gerade einen Fehler" "Wie lautet die Meldung?" "Weiß nicht, hab ich weggeklickt" ;)
vagtler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 96
Erhaltene Danke: 24


Delphi 2010, C# (VS 2012), Objective-C, Java
BeitragVerfasst: Mo 06.01.14 09:58 
Auch eine interne One-Man-Show kann zu dieser Kategorie zählen - ich nehme an, Ihr macht das nicht aus Spaß an der Freud... ;)