Programmier-Experten gesucht

  • Hallo.


    Ich spiele seit einiger Zeit mit C herum, als Entwicklungsumgebung habe ich LCC Win32, wobei ich eigentlich immer im Entwicklungs- oder Debug-Mode bin.


    Hauptsächlich arbeite ich am Notebook, ab und zu aber auch am Desk.


    Dabei kam es nun - nachdem wieder einige Erweiterungen, Änderungen vorgenommen wurden zu einem recht merkwürdigen Effekt, am Desk stieg das Prog sofort mit dem Fehler Access violation oder segment violation 0xc0000005 aus.


    Dies ist - nach googelei - eine Allerwelts-Speicherverletzung die zumindest ich nicht genauer bestimmen kann. Wohlgemerkt, auf dem Noteboook läuft es, es ist also zu vermuten, dass die Umgebung des Desk damit was zu tun hat. Auf beiden PC läuft XP Home.


    Um das Verwirrspielchen noch etwas weiter zu treiben, im Compiler gibt es eine Möglichkeit events anzusehen. Dort wird dann auch das Modul gemeldet, in dem der Speicherfehler auftritt. Dabei gibt es 2 Warnzustände: First Chance und Second Chance. Ersteres ist offenbar nur eine Warnung, die man nur unter events sieht, Second Chance führt dann zum Programmabbruch mit Fehlerfenster.


    Der Fehler tritt in Modulen auf, die auch in anderen Progs laufen, und zwar problemlos.


    Gibt es jemand hier, der mir den "Fuss vom Schlauch" nehmem kann?

  • Hallo Charly



    Da haste ja Glück, daß ich - relativ zeitnah - mal wieder hier ins Forum geguckt habe, obwohl ich aus der Ferne auch nur klugscheißen oder glaskugeln kann. ;)


    Aber mal langsam.


    Zitat

    Original von karomue
    Dabei kam es nun [zu einer] Access violation oder segment violation 0xc0000005.


    Das ist immer schlecht und bedeutet, dein Programm versucht lesend oder schreibend auf Speicheradressen zuzugreifen, die dem Programm nicht vom Betriebssystem zugewiesen wurden.


    Genaugenommen versucht der Maschinenbefehl an der Adresse 0x00406DD3 in deinem Programm auf eine solche Adresse im Speicher zuzugreifen und löst damit diese Exceptions aus. Das wird wohl ein MOV-Befehl sein, der in der For-Schleife den Rückgabewert von malloc (Pointer) in das kmlPointArr - Array schreiben soll.



    Glaskugel on
    Ich tippe, du überschreibst dir den Inhalt deiner Variablen i, PointZeile oder gar die Adresse von kmlPointArr auf dem Stack (oder im Datensegment (globale Variablen) falls sie dort definiert sind) in dieser Schleife. Das muß dann irgendwann knallen.
    Glaskugel off


    Test:
    Programm im Debugger "durchsteppen" (F8 ) und dabei die drei Variablen in der Schleife anzeigen lassen und beobachten ("Watch" oder über "Locals").




    Zitat

    Original von karomue
    Wohlgemerkt, auf dem Noteboook läuft es, es ist also zu vermuten, dass die Umgebung des Desk damit was zu tun hat. Auf beiden PC läuft XP Home.


    Das ist äußerst unwahrscheinlich.


    Du verwendest auf beiden Computern die selbe Version von LCC und die gleichen Compiler/Linker-Einstellungen?


    Die erstellten Programme (UBX.exe) sind auf beiden Computern (bit)identisch? (Einfach mit MD5.exe aus den bin-Verzeichnis testen und den Hash vergleichen.)


    An der crtdll.dll dürfte es nicht liegen. An der hat MS schon seit Ewigkeiten nix mehr geändert.




    Zitat

    Original von karomue
    Um das Verwirrspielchen noch etwas weiter zu treiben [...] First Chance und Second Chance.


    Charly - dat is a bissle kompliziert. Aber zum "Einlesen" etwas SEH unter Windows in Deutsch:


    http://software.magnus.de/prog…s-exception-handling.html



    Wie auch immer, ich tippe zunächst auf Usererror. Notfalls mußt du dein Programm mal ausschlachten, bis nur noch der Fehler reproduzierbar übrigbleibt. Das heißt, Quelltext in ein neues Projekt kopieren und dann alles weglöschen was nicht gebraucht wird.




    bfn hevo2




    EDIT:


    Kleinen (Fasel)Fehler im Bildchen gefunden...


    buffer1 = malloc(0x100);
    if (!buffer)
    ....


    Du testet "buffer" auf NULL, nicht ob malloc in "buffer1" gerade NULL zurückgegeben hat. Es ist zwar wirklich äußerst unwahrscheinlich, falls buffer1 aber NULL enthält (malloc konnte also keinen Speicher "besorgen"), "knallt" es in deinem Progi (Access_Violation) beim ersten Zugriff auf buffer1, da dein Progi dann auf die Adresse 0x00000000 zugreifen will...



    Die lächerlichen 256 Bytes für buffer1 kannst du auch auf dem Stack ohne malloc(he) - kleines Wortspiel - ;) in _main ablegen.


    Man kann das Ganze sogar noch weitertreiben und praktisch Speicherplatz für viele uninitialisierte Variablen eines Programms im Stack der _main-Funktion unterbringen. Die Startadresse einer solchen Variable bleibt während der gesamten Laufzeit des Programms gültig (und Windows sorgt auch dafür, daß der Stack "ausgenullt" ist) . Nachteil: Man muß Funktionen außerhalb von _main die Adresse einer Variablen mitteilen...


    Aber das alles führt hier jetzt zu weit.

    Einmal editiert, zuletzt von hevo2 ()

  • Wow.


    Nu hab ich ja wieder was zum Nachdenken. ?( ?(


    Bist Du eigentlich irgendwie hiesig, evtl. erreichbar?


    Ob alles identisch ist, kann ich - mangelnder Tiefgang - nur vermuten. Ich "arbeite" eigentlich immer (noch) in der Entwicklungsumgebung/Debugger, das Source-File wird hauptsächlich auf dem NB "bearbeitet" und nur ab und zu auf den Desk kopiert. Und bei einem der letzten Versuche es laufen zu lassen stieg es aus.


    Passiert aber auch mit einer älteren Version- früherer Bearbeitungsstand - und da hätte ich tausend Eide geschworen, dass die schon mal lief.


    Abspecken ist an sich eine hervorragende Idee, genau wie durchtakten. Für jemand mit Deinem Wissensstand sicher erfolgreich machbar, für mich...???? Darüber schweigen wir jetzt lieber.


    buffer1, da ist wohl ein Fehler reingerutscht. Die Access Violation kommt mindestens an 2 Stellen, soweit hatte ich es schon mal gesehen. O.K., ich krame mal.


    Danke (mal wieder :] ).


    PS: Du bist doch umgezogen, 48° 00', 7° 38' dürfte wohl nicht mehr stimmen, oder?

    Einmal editiert, zuletzt von karomue ()

  • Ja, Heiko,


    offensichtlich sind wir viel zu weit auseinander.


    Oder so: ich habe inzwischen (vielleicht) gelernt wie man "die Eimer Wasser holen lässt", aber es abzustellen.... Zauberlehrling halt.


    Oder: je mehr ich weiß, desto mehr weiß ich dass ich nichts weiß.


    Nun habe ich die letzten Tage - so vor 2 Wochen oder so - gesehen, dass es in der Fußzeile des lcc ein events gibt, dort steht dann auch recht oft First Chance,was immer da nun wirklich heißt. Und dort wird das erste Access Violation in "lpstrKill=malloc..." mit First Chance gemeldet ohne dass ich nun weiß, ist das bereits ein "gefährlicher" Zustand. Denn, das kann nur dann sein, wenn ich durch weitergehende Programmierung einen hier eingreifenden Fehler eingebaut hätte, dass es in Deiner Grundprogrammierung schon ein Fehler sein könnte ist wohl so gut wie auszuschließen.


    Und das ist halt auch eines der Grundprobleme


    - es wäre geprahlt wenn ich sagen würde, ich hätte Dein Grundkonzept auch nur annähernd verstanden,
    -was sich auch schon darin äußert, dass es mir bislang nicht gelungen ist den "Kill-Teil zu entfernen. Ohne es allerdings auch mit nötigem Nachdruck betrieben zu haben.


    So bin ich jetzt in der unangenehmen Lage ein paar Brocken zu kennen, ein paar Mosaiksteine zu sehen, aber das Gesamtbild wird vermutlich nie werden. Was an vielen Gründen liegt, die wir jetzt nicht weiter vertiefen müssen.


    Dazu kommt, dass es hier mit Dir noch einen freundlichen Helfer gibt, Ihr beide konntet mirimmmermal wieder einen Schubs geben. Mur, die gleiche Sprache sprechen wir halt leider nicht, da fehlt es mir einfach an "Wortschatz".


    Nun gut, das gibt jetzt wieder eine tage- bis wochenfüllende Suche. Ob dabei was wirklich verständliches herauskommt, das weiß ich noch nicht.

  • Hallo Charly!


    Sorry, ich habe seit dem 12.8.08 und deiner ersten Antwort am 12.8. nicht nochmal in diesen Thread geschaut. Damit habe ich dein zweites Posting an diesem Tag übersehen. Hättest du 1-2 Tage später geschrieben, wäre es mir aufgefallen... ;)


    Um es kurz zu machen: Schick mir den notwendigen Krempel (Quelltext + die nötigen Files für den Input des Progis) einfach mal per eMail. Ich schau mir das dann bei Gelegenheit mal an. Irgendwo muß ja ein Fehler stecken.


    Zitat


    Und dort wird das erste Access Violation in "lpstrKill=malloc..." mit First Chance gemeldet


    Mmm - der Variablenname "lpstrKill" könnte zwar von mir stammen, da damit sicher ein Pointer auf einen String der irgendwas "killen" soll gemeint ist, ich finde diesen "Bezeichner" aber nicht in deinem Progi mit Stand vom August 2007. Ja, letzter Stand 08/2007.


    Außerdem wird - laut deinem Screenshot - gerade eine "wmfhotfix.dll" (wer/was/warum -> siehe Google) in den Addressraum deines Progis geladen. Möglicherweise "knallt" es dort etwas - und dieses "Ereignis" kommt halt bei den "Events" in der LCC-IDE an.


    Ich weiß es nicht.


    Aus der Ferne kann ich dir wirklich nicht weiterhelfen. Schick mir den Kram - und wir werden sehen. Und mach dir mal keinen Kopf wegen des "Know-Hoff". Ich habe wirklich keine Zeit für Trackpoints und KML-Zeugs. ;)



    bfn hevo2


  • Hallo Heiko,


    hm, das generiert neue Fragen.


    Aber lassen wir das hir im Moment, lass mich etwas nachdenken, einiges zusammenstellen. Ich denke, dass ich bis zum WE per PN kommen kann. Da wird dann - vermutlich schrecklich für Dich - die letzte Version des Progs und - sollte noch vorhanden sein - Deine Erstversion mit anhängen. Danke im Voraus, weiteres dann per PN.