Autor Beitrag
Tintenblut
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 39
Erhaltene Danke: 2



BeitragVerfasst: Do 22.01.09 14:31 
Hallo,

mich wurmt nun schon seit längerer Zeit ein Fehler in meinem Messengerprogramm. Um etwas genauer zu werden: Es handelt sich hierbei um eine AccessViolation.

user defined image

Dieser Fehler tritt sehr sporadisch auf und ist nicht reproduzierbar.

Mit meinem Messenger greife ich auf eine Oracle Datenbank zu um dort die Nachrichten mit dem Messenger zu speichern, und sie später durch 2 Timer wieder abzurufen. Wenn man eine Nachricht schreibt, muss man eine Gültigkeitsdauer angeben welche in ein DateTime-Format hat.
Ein Job in der Datenbank kontrolliert diese Werte alle 30 Minuten und setzt die betreffende Nachricht auf gelöscht wenn die Nachricht < des aktuellen DateTimes ist.

An den Timer (welches mein erster Verdacht war) sollte es nicht liegen. Diese habe ich in einem Test aus dem Programm rausgenommen.

Auf diese Zugriffsverletzungen bauen sich folgende Fehler auf:

- ORA-24338: Anweisungs-Handle nicht ausgeführt
- ORA-24909: Aufruf erfolgt. Aktueller Vorgang abgebrochen
- ORA-03114: Nicht mit Oracle verbunden.

Im Forum habe ich die Möglichkeit gefunden, solche Fehler durch madExcept finden zu können.
Allerdings weiß ich als Programmieranfänger diese nicht wirklich zu deuten.

Hier ein Auszug aus dem Report der Zugriffsverletzung (ich denke nach Beseitigung dieser, werden die Folgemeldungen auch verschwinden):

Zitat:
callstack crc : $00000000, $f34420ac, $f34420ac
exception number : 1
exception class : EAccessViolation
exception message : Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000.

main thread ($8d8):
00000000 +000 ???
004f0b11 +045 Messenger.exe DB TDataSet.GetFieldData
6149d37b +02b oran10.dll nioqwa
7c920412 +025 ntdll.dll RtlAcquirePebLock
6149d37b +02b oran10.dll nioqwa
606a4f98 +068 OraClient10.Dll kpurcsc
60684408 +c58 OraClient10.Dll kpuexec
60621f79 +01d OraClient10.Dll OCIStmtExecute
1000ad61 +031 oci.dll OCIStmtExecute
00553921 +3c9 Messenger.exe Oracle TOracleQuery.InternalExecute
00554345 +0b1 Messenger.exe Oracle TOracleQuery.ExecuteArray
00554229 +075 Messenger.exe Oracle TOracleQuery.Execute
00575e27 +1fb Messenger.exe OracleData TOracleDataSet.QueryRecords
00577a78 +05c Messenger.exe OracleData TOracleDataSet.InternalRefresh
004f25e5 +035 Messenger.exe DB TDataSet.Refresh
005a88b9 +039 Messenger.exe MessengerMain 820 +5 TfrmMessengerMain.tFlashTimer
004978df +00f Messenger.exe ExtCtrls TTimer.Timer
004977c3 +02b Messenger.exe ExtCtrls TTimer.WndProc
004759b4 +014 Messenger.exe Classes StdWndProc
7e3696c2 +00a user32.dll DispatchMessageA
004c3fbc +0fc Messenger.exe Forms TApplication.ProcessMessage
004c3ff6 +00a Messenger.exe Forms TApplication.HandleMessage
004c4216 +096 Messenger.exe Forms TApplication.Run
005aa52c +0cc Messenger.exe Messenger 41 +19 initialization


Zitat:
stack dump:
0012b7c4 31 0e 51 60 f4 66 83 02 - c8 84 83 02 00 00 00 00 1.Q`.f..........
0012b7d4 02 00 00 00 80 0f b4 00 - 00 00 00 00 00 80 56 00 ..............V.
0012b7e4 09 00 00 00 02 00 00 00 - d4 6e b5 00 2c 03 b4 00 .........n..,...
0012b7f4 80 0f b4 00 0c b8 12 00 - 74 7e 57 00 09 00 00 00 ........t~W.....
0012b804 2c 03 b4 00 1c 08 b4 00 - 1c 08 b4 00 2c 03 b4 00 ,...........,...
0012b814 f7 85 57 00 98 01 00 00 - f0 7c b6 00 1c 08 b4 01 ..W......|......
0012b824 bb d8 12 00 2c 03 b4 00 - 1c 08 b4 00 64 d8 12 00 ....,.......d...
0012b834 17 0b 4f 00 70 d8 12 00 - d8 0b 4f 00 e0 0b 4f 00 ..O.p.....O...O.
0012b844 bb d8 12 00 2c 03 b4 00 - 84 11 56 00 88 d8 12 00 ....,.....V.....
0012b854 d8 0b 4f 00 e0 0b 4f 00 - d3 d8 12 00 01 00 00 00 ..O...O.........
0012b864 84 11 56 00 2c 03 b4 00 - 84 11 56 00 98 b8 12 00 ..V.,.....V.....
0012b874 c0 2c c2 00 01 00 00 00 - f5 57 56 00 01 00 00 00 .,.......WV.....
0012b884 15 58 56 00 1d 58 56 00 - 00 00 00 00 00 00 00 00 .XV..XV.........
0012b894 f0 73 c1 00 01 00 00 00 - e8 41 b4 00 fc b9 46 00 .s.......A....F.
0012b8a4 c0 2c c2 00 84 11 56 00 - c0 2c c2 00 84 11 56 00 .,....V..,....V.
0012b8b4 f5 57 56 00 e0 b8 12 00 - c0 2c c2 00 c0 2c c2 00 .WV......,...,..
0012b8c4 84 11 56 00 f5 57 56 00 - f4 b8 12 00 c0 2c c2 00 ..V..WV......,..
0012b8d4 84 11 56 00 f5 57 56 00 - 04 b9 12 00 15 58 56 00 ..V..WV......XV.
0012b8e4 1d 58 56 00 00 00 00 00 - 00 00 00 00 f0 73 c1 00 .XV..........s..
0012b8f4 01 00 00 00 e8 41 b4 00 - fc b9 46 00 c0 2c c2 00 .....A....F..,..

disassembling:
[...]
005a88a4 call -$1a3935 ($404f74) ; System.@LStrCmp
005a88a9 jnz loc_5a89f5
005a88af 820 mov eax, [$5b2bd4]
005a88b4 mov eax, [eax]
005a88b6 mov eax, [eax+$58]
005a88b9 > call -$b630e ($4f25b0) ; DB.TDataSet.Refresh
005a88be 822 mov eax, [$5b2bd4]
005a88c3 mov eax, [eax]
005a88c5 mov eax, [eax+$b0]
005a88cb call -$b8b50 ($4efd80) ; DB.TDataSet.Close
005a88d0 823 mov eax, [$5b2bd4]
[...]



Hinzufügend:
- Ich verwende keine Threads und auch keine Nil-Pointer.


Über Hilfestellungen / Hinweise würde ich mich sehr freuen!

LG Christian
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 22.01.09 14:33 
hast du was im oncreate om form stehen?

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 22.01.09 14:47 
Das sieht nach einem Problem im Oracle-Datenbanktreiber aus ...

Aber der Stacktace an sich scheint schon irgendeinen Klatsch weg zu haben ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Tintenblut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 39
Erhaltene Danke: 2



BeitragVerfasst: Do 22.01.09 14:52 
@BenBE: Kannst du mir das etwas näher erläutern? Wie kommst du auf den Treiber der Datenbank?

@elundril:

Ja habe ich.

Hier einmal der Source:
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:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
procedure TfrmMessengerMain.FormCreate(Sender: TObject);
begin
  dtmMessengerDaten := TdtmMessengerDaten.Create(self);
  PCName := GetEnvironmentvariable('computername');
  FExitWindows := false;

  try
  with dtmMessengerDaten do
  begin
    // Wenn Nachricht geschrieben -> sofortige Übertragung Msg
    // Setzen der SQL-Anweisung - Grid der neuen Nachrichten
    ses.Connected := true;

    dtsMsgListNeue.SQL.Clear;
    dtsMsgListNeue.SQL.Add('select * ');
    dtsMsgListNeue.SQL.Add('from nachrichteninfo');
    dtsMsgListNeue.SQL.Add('where geloescht = 0');
    dtsMsgListNeue.SQL.Add('and gelesen = 0 and gesendet_an = ''' + PCName + '''');
    dtsMsgListNeue.SQL.Add('order by datum desc');
    dtsMsgListNeue.open;

    // Setzen der SQL-Anweisung - Grid gelesene Nachrichten
    dtsMsgListGelesene.SQL.Clear;
    dtsMsgListGelesene.SQL.Add('select * ');
    dtsMsgListGelesene.SQL.Add('from nachrichteninfo');
    dtsMsgListGelesene.SQL.Add('where geloescht = 0');
    dtsMsgListGelesene.SQL.Add('and gelesen = 1 and gesendet_an = ''' + PCName + '''');
    dtsMsgListGelesene.SQL.Add('order by datum desc');
    dtsMsgListGelesene.open;

    // Setzen der SQL-Anweisung - Grid gelöschte Nachrichten
    dtsMsgListPapierkorb.SQL.Clear;
    dtsMsgListPapierkorb.SQL.Add('select * ');
    dtsMsgListPapierkorb.SQL.Add('from nachrichteninfo');
    dtsMsgListPapierkorb.SQL.Add('where geloescht = 1 and gesendet_an = ''' + PCName + '''');
    dtsMsgListPapierkorb.SQL.Add('order by datum desc');
    dtsMsgListPapierkorb.open;

    dtsGesendet.SQL.Clear;
    dtsGesendet.SQL.Add('select id, absender, gueltigkeit, empfaenger, betreff, nachricht, datum');
    dtsGesendet.SQL.Add('from nachrichteninfo');
    dtsGesendet.SQL.Add('where absender = ' + QuotedStr(PCName));
    dtsGesendet.SQL.Add('order by datum desc');
    dtsGesendet.Open;
  end
  except
    ShowMessage('Fehler bei der Nachrichtenanzeige');
  end;
  aktiverTimer := 'TimerRefresh';
  tRefresh.Enabled := True;


lg Christian
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 22.01.09 15:30 
Ganz einfach: Weil im Stacktrace DLLs mit Ora* aufgeführt sind: Das sind die Oracle-Treiber.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 22.01.09 19:04 
Oracle hat keine Fehler :P Designfehler ja, aber keine Programmierfehler...

Die Abfragen sehen OK aus, aber warum erstellst du da ein freifliegendes Datenmodul? Vermutlich geht da irgendwas schief...

Aber trotzdem, Client- und Serverversion wären mal noch interessant. Der 8.1er Client kriegt nämlich von einem 10er Server grundsätzlich leere Resultsets, eventuell hast du da ja auch so einen Effekt.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Do 22.01.09 19:25 
kleiner Tip, obwohl hier wahrscheinlich nicht zutreffend:
ersetze mal
ausblenden Delphi-Quelltext
1:
dtsMsgListPapierkorb.SQL.Add('where geloescht = 1 and gesendet_an = ''' + PCName + '''');					

mit

ausblenden Delphi-Quelltext
1:
dtsMsgListPapierkorb.SQL.Add(format('where geloescht = 1 and gesendet_an = %s',[QuotedStr(PCName)]));					


damit umgehst du Probleme die Auftauchen, wenn Hochkommas in den Parametern bereits stecken. Solche
Fehler sind schwer zu finden.

Vielleicht ist es ja auch interessant, wenn du dir die Oracle Anbindungskomponenten von ODAC (www.devart.com/odac/) mal anschaust.
:-)Msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Tintenblut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 39
Erhaltene Danke: 2



BeitragVerfasst: Fr 23.01.09 09:38 
@BenBE: Danke für die Info.

@Martok: In dem DatenModul liegen meine ganzen DataSources, DataSets, Querys und die Session. Mit der Erstellung dort, wollte ich sichergehen, dass das Modul 100% erstellt ist.

Oracle-Serverversion ist 11er und die auf den Clients (bei den Testpersonen) ist die 10er.

@MSCH: Danke :) Die QuotedStrings habe ich erst später kennengelernt. Später im Programm verwende ich sie schon, habs nur noch nicht überall umgewandelt :?
Obwohl ich das mit dem Format noch nicht kannte 8)
Danke für die Tipps :D

Christian
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 23.01.09 10:10 
is es schon gelöst?

wenn nicht würd ich mal vorschlagen du verschiebst den code den du im on create hast mal testweise in die OnShow vom Form. Meine wildeste Vermutung ist nämlich das dieser Teil dtmMessengerDaten := TdtmMessengerDaten.Create(self); im OnCreate probleme macht, im OnShow aber nicht.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: Fr 23.01.09 10:21 
Ein kleinbisschen OT.

wie wärs mit Parametern?

Quoted-String, toll....

I' ll call my PC '; DROP TABLE ....'

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
Tintenblut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 39
Erhaltene Danke: 2



BeitragVerfasst: Fr 23.01.09 10:26 
@elundril: werde ich gleich mal testen. Danke.

@hazard999: Ich kann dir leider gerade nicht ganz folgen.

Christian
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: Fr 23.01.09 10:34 
Beschäftige dich mal mit SQL-Injection.

Ausserdem haben paramtrisierte Queries noch ein paar andere Vorteile.
Geschwindigkeit (Prepare), Typensicherheit, ...

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
Tintenblut Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 39
Erhaltene Danke: 2



BeitragVerfasst: Fr 23.01.09 11:19 
@elundril: ich habs gerade mal ins onShow verschoben.
Beim Compilieren kommt nun schon eine Zugriffsverletzung:

user defined image

edit// Da gibt es dann wohl Probleme beim Ausführen der SQL-Statements bzw. beim Zugriff auf die DataSets.
edit2// Hat sich erledigt denke ich... ich sollte auch alles und nicht nur das Create des DataModuls verschieben.
Jetzt heißt es abwarten, ob ich nun eine Zugriffsverletzung bekomme...

@hazard999: Mach ich. Danke für den Tipp.

Christian