Seite 2 von 2

Verfasst: Di, 12. Aug 2008 10:58
von Martin Altmann
Hallo Jan,
ich sehe ja auch keinen Fehler - darum war es ja auch nicht so leicht zu finden!
Ich sehe es eher als Schwachstelle (Garbage Collector?)!
Beispiel:

Code: Alles auswählen

for nI := start to ende
	C := alltrim( str( nI ) )
	if .not. empty( g&dateiname->tag&c )
		bla := 0
		s&dateiname->( DbClearFilter() )
		s&dateiname->( DbSetFilter( {|| ( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == nI ) ) }, "( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == nI ) )" ) )
		goto top
...
Wurde jetzt geändert in:

Code: Alles auswählen

if .not. empty( g&dateiname->tag1 )
	bla := 0
	s&dateiname->( DbClearFilter() )
	s&dateiname->( DbSetFilter( {|| ( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 1 ) ) }, "( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 1 ) )" ) )
	goto top
....
if .not. empty( g&dateiname->tag2 )
	bla := 0
	s&dateiname->( DbClearFilter() )
	s&dateiname->( DbSetFilter( {|| ( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 2 ) ) }, "( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 2 ) )" ) )
	goto top
....
if .not. empty( g&dateiname->tag3 )
	bla := 0
	s&dateiname->( DbClearFilter() )
	s&dateiname->( DbSetFilter( {|| ( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 3 ) ) }, "( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 3 ) )" ) )
	goto top
....
Viele Grüße,
Martin

Verfasst: Di, 12. Aug 2008 12:12
von Jan
Martin,

vielleicht kannst Du das ja mal an Alaska geben. Damit die etwas Ursachenforschung betreiben können. Mich würde das auch mal interessieren, ich habe nämlich ab und an auch einen Komplettabsturz, so ganz ohne jede Fehlermeldung.

Jan

Verfasst: Di, 12. Aug 2008 12:20
von Martin Altmann
Hallo Jan,
Jan hat geschrieben:vielleicht kannst Du das ja mal an Alaska geben. Damit die etwas Ursachenforschung betreiben können.
nein - da ich ja nur eine "Sub ohne Sup" habe...
Abgesehen davon läuft es jetzt ja.
Und ein Absturz ohne Meldung ist eher untypisch - zumindest eine XPPFATAL müsste es dann geben...
Entscheidend war in meinem Fall der Anfang:
XPPFATAL.LOG hat geschrieben:Module: MOM
Error Codes: EH: 4 Sub: 5(5) OS: 5 XPP: 40
Also MemoryObjectModel -> Zugriff verweigert.
Das gab mir halt zu denken und darum habe ich halt in Richtung Ressourcen/Handles/Heaps gedacht/gesucht.

Viele Grüße,
Martin

Verfasst: Di, 12. Aug 2008 13:03
von Manfred
Hi Martin,

das verstehe ich jetzt nicht. Support sehe ich so, dass man Fragen über Lösungen stellen kann. Was Du aber, hast scheint mir irgendwie ein Problem von Xbase++ zu sein und da ist es mir sch......., ob ich einen Support habe oder nicht, wenn ich einen Fehler entdecke, dann sage ich denen Bescheid. Wenn dann der Support glaubwürdig der Meinung ist, es wäre kein Fehler, dann kann man immer noch verhandeln.

Verfasst: Di, 12. Aug 2008 14:17
von Martin Altmann
Hallo Manfred,
brauchst Du auch nicht :wink:
Ich habe mal in der Knowledgebase gestöbert:
http://www.alaska-software.com/scripts/ ... PDRID=5024
Und das ist auch die Lösung: Keine local und keine private in der Filterbedingung!!
Habe ein Beispiel zum Einsenden an Alaska gebaut und es knallte.
Habe dann mal die Filterbedingung:

Code: Alles auswählen

s&dateiname->( DbSetFilter( {|| ( ( .not. empty( nachzuchtg ) ) .and. ( ntag2 == nI ) ) }, "( ( .not. empty( nachzuchtg ) ) .and. ( ntag2 == nI ) )" ) )
geändert in:

Code: Alles auswählen

s&dateiname->( DbSetFilter( {|| &("( ( .not. empty( nachzuchtg ) ) .and. ( ntag2 == "+alltrim(str(nI))+" ) )") }, "( ( .not. empty( nachzuchtg ) ) .and. ( ntag2 == "+alltrim(str(nI))+" ) )" ) )
und siehe da - es geht!!
Also nicht nur RTFM, sondern auch RTFKB :!:
Gut, dass ich es nicht eingeschickt habe :D

Viele Grüße,
Martin

Verfasst: Di, 12. Aug 2008 14:41
von Martin Altmann
Kleiner Hinweis noch am Rande: auch publics gehen nicht!
Habe allerdings noch einige Stellen im Programm, wo ich publics im Filter verwende und was bisher funktioniert - scheinbar.
Muss ich dann auch entsprechend ändern!

Viele Grüße,
Martin

Verfasst: Mi, 13. Aug 2008 10:13
von Christof
Hallo Martin,
Kleiner Hinweis noch am Rande: auch publics gehen nicht!
ich habe auch an einigen Stellen publics in Filterbedingungen, weil ich gemerkt hatte, dass es mit locals nicht geht. Grundsätzlich scheint das mit publics also zu gehen, oder? Knallt das Programm dann beim zweiten oder dritten Durchlauf wg. Heap etc.?

Gruß

Christof

Verfasst: Mi, 13. Aug 2008 11:25
von Martin Altmann
Hallo Christof,
ja - egal ob private, public oder local (was anderes habe ich nicht versucht). Das Testprogramm von mir schmierte dann ab.
Ich habe noch viele weitere Filter (auch mit local, geht!), die bisher ohne Probleme liefen - die stelle ich jetzt gerade um auf Makro.
Das Problem dabei ist ja, dass der Absturz nicht an der Stelle auftauchen muss, an der das Problem liegt!

Viele Grüße,
Martin

Verfasst: Mi, 13. Aug 2008 17:18
von Koverhage
Martin,

bei der Gelegenheit hätte ich

s&dateiname->

in

(dateiname)->

geändert ;-)

Vorteil Macro fällt weg, Private variable entfällt und dürfte etwas schneller sein.

Gruß
Klaus

Verfasst: Mi, 13. Aug 2008 17:23
von Martin Altmann
Hallo Klaus,
ich brauche nicht (dateiname), sondern s(dateiname) - und das geht ja so nicht...
Also: meine DBF heißt SCACIB41.DBF und in dateiname steht CACIB41

Viele Grüße,
Martin

Verfasst: Mi, 13. Aug 2008 18:06
von brandelh
Martin Altmann hat geschrieben:Hallo Klaus,
ich brauche nicht (dateiname), sondern s(dateiname) - und das geht ja so nicht...
Also: meine DBF heißt SCACIB41.DBF und in dateiname steht CACIB41

Viele Grüße,
Martin
Hi,

wie wäre es mit

Code: Alles auswählen

("S"+dateiname)

Verfasst: Mi, 13. Aug 2008 18:13
von Martin Altmann
Hallo Hubert,
ja - oder
dateiname2 := "s" + dateiname
( dateiname2 )->( DbSetFilter(...
Aber es läuft ja so und es gibt keinerlei merkbare Geschwindigkeitseinbußen.

Viele Grüße,
Martin

Verfasst: Mi, 13. Aug 2008 18:39
von Koverhage
Martin,

das war mir klar, war nur als Beispiel gedacht.

Re: Programmabsturz (XPPFATAL.LOG) - wahrscheinlich Mem.-problem

Verfasst: Di, 22. Aug 2017 16:47
von Bertram Hansen
Hallo zusammen,

ich habe jetzt längere Zeit die Ursache für einen XPPFATAL Error gesucht und bin hier fündig geworden. Dank an Martin. :wink:
Dann habe ich noch ein paar Dinge ausprobiert die ich kurz vorstelle. Vorher muss ich erwähnen, dass ich mir nie groß Gedanken gemacht haben, wenn ich DbSetFilter() mit Variabeln verwendet habe.
Der XPPFATAL Error beim Kunden ist auch nie beim ersten Durchlauf aufgetreten, sondern nur wenn man 3 oder 4 mal das hintereinander aufgerufen hat.


Hier gibt es einen Programmabbruch siehe Alaska PDR ID 5024 bzw. 4657
Dabei ist es egal, ob die Variable nFirma als Parameter übergeben wird oder ob die Variable als LOCAL, PRIVATE oder PUBLIC deklariert wurde.

Code: Alles auswählen

FUNCTION Test1(nFirma)

   SET OPTIMIZE ON
   alias->(dbsetfilter({|| !alias->akdrlf .AND. alias->akfirma = nFirma .AND. !alias->aksperr}))
   MyBrowse()
   alias->(dbclearfilter())
   SET OPTIMIZE OFF
   
RETURN .T.

Wird SET OPTIMIZE OFF verwendet, dann gibt es keine Probleme

Code: Alles auswählen

FUNCTION Test2(nFirma)

   SET OPTIMIZE OFF
   alias->(dbsetfilter({|| !alias->akdrlf .AND. alias->akfirma = nFirma .AND. !alias->aksperr}))
   MyBrowse()
   alias->(dbclearfilter())
   SET OPTIMIZE ON
   
RETURN .T.

Hierbei gibt es auch kein Problem, wenn die Filterbedingung 'zusammengebaut' wird. Egal wie dann SET OPTIMIZE steht. Den Tipp habe ich von Eugen bekommen.

Code: Alles auswählen

FUNCTION Test3(nFirma)

   LOCAL bCodeFilter := NIL, cCodeFilter := ""
   
   cCodeFilter := "!alias->akdrlf .AND. alias->akfirma = " + STR(nFirma,2) + " .AND. !alias->aksperr"
   cCodeFilter := "{|| " + cCodeFilter + "}"
   bCodeFilter := &(cCodeFilter)
   
   SET OPTIMIZE ON // OFF
   alias->(dbsetfilter(bCodeFilter))
   MyBrowse()
   alias->(dbclearfilter())
   SET OPTIMIZE OFF // ON
   
RETURN .T.

Re: Programmabsturz (XPPFATAL.LOG) - wahrscheinlich Mem.-problem

Verfasst: Di, 22. Aug 2017 18:24
von AUGE_OHR
hi,

wie ich immer sagte : SET OPTIMIZE OFF

mich würde mal interessieren ob OPTIMIZE überhaupt was bringt ... hat jemand "Zahlen" als Vergleich ?

Re: Programmabsturz (XPPFATAL.LOG) - wahrscheinlich Mem.-problem

Verfasst: Di, 22. Aug 2017 22:51
von DelUser01
Ich verwende Standardmäßig immer
Set( _SET_OPTIMIZE , .T. )
außgenommen in Bereichen mit DbSetFilter(..), da ist
Set( _SET_OPTIMIZE , .F. )
und nach DbClearFilter() wieder auf .T.

Hatte auch schon festgestellt dass OPTIMIZE ON mit SET FILTER Probleme macht...

@Jimmy
das Leben ist zu kurz um jede Funktion auf Herz und Nieren zu prüfen...

Re: Programmabsturz (XPPFATAL.LOG) - wahrscheinlich Mem.-problem

Verfasst: Di, 22. Aug 2017 23:17
von AUGE_OHR
Roland Gentner hat geschrieben: Di, 22. Aug 2017 22:51... um jede Funktion auf Herz und Nieren zu prüfen ...
das war mein erster BUG den ich mit Xbase++ hatte -> er fand keinen Datensatz :shock:

nun waren damals noch viel mehr Cl*pper Apps im gemeinsamen Betrieb und dafür hab ich alles abgeschaltet was Cl*pper nicht kennt. das gilt zumindest für NTX während es bei SixDrive/Comix und CDX weniger Probleme machte. man kann aber SET OPTIMIZE nur global setzten und nicht getrennt für DBFNTX / FOXCDX

sicherlich verliert man mit OFF Performance aber was Geschwindigkeit angeht steigt die durch neue Hardware sicherlich viel mehr als die Cache Tricks welche für HDD und 10mBit Netzwerke notwendig wahren.