Autor |
Beitrag |
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 11.07.12 16:23
Heute mal ein etwas seltsameres Problem. Nein, ich meine nicht Windows, ist aber mit diesem verwandt.
Grundlegend geht es darum:
- Ich habe zwei Programme A und B, Programm A läuft aktuell
- In Programm A lade ich Programm B und A' herunter (und überprüfe die Integrität)
- In Programm A schreibe ich B und A' auf Festplatte. Das Schreiben ist erfolgreich
- Programm A startet Programm B mit Kommandozeile "B A A'" und beendet sich dann
- Programm B startet und wartet darauf, dass A beendet ist (A hält einen Mutex)
- Programm B wertet die Parameter aus und prüft, ob UAC nötig ist
- Programm B übersetzt Laufwerkspfade in UNC-Pfade um um einen Bug in Windows herumzuarbeiten (Laufwerks-Mappings sind pro User, was zu Problemen bei UAC führt)
- Prüfen, ob Dateien existieren --> Sporadischer Fehler, dass A' fehlt
- Programm B benennt A nach A.backup um (erfolgreich)
- Programm B benennt A' nach A um (schlägt sporadisch fehl)
- Programm B löscht A.backup
- Wenn fehlgeschlagen und UAC möglich, bisherigen Ablauf mit UAC erneut probieren (B wartet hier auf sich selbst zur Synchronisation)
- Programm B startet A (also entweder ursprüngliches A oder A')
Soweit so einfach. Halt ein normaler Updater. Interessant ist nun, dass die neue Datei sporadisch nicht "existiert", obwohl diese laut Protokoll erfolgreich geschrieben wird.
Jemand von euch eine Idee, wo man da suchen kann? Ach ja: Problem tritt NUR auf XP auf und auch dort immer nur exakt einmal (AKA SEHR selten AKA am Tag vielleicht einmal reproduzierbar).
_________________ 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.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.07.12 17:00
Spontan würde ich auf ein Antivirenprogramm tippen. Die Verhaltensanalyse schlägt da ja immer wieder mal unvorhersehbar zu.
|
|
BenBE 
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 11.07.12 17:13
jaenicke hat folgendes geschrieben : | Spontan würde ich auf ein Antivirenprogramm tippen. Die Verhaltensanalyse schlägt da ja immer wieder mal unvorhersehbar zu. |
Hab ich auch zuerst vermutet, konnte ich aber recht schnell ausschließen indem ich das auf einem blanken WinXP getestet hab. Da tritt der Fehler auch auf.
Konnte den Fehler inzwischen schon ein bisschen genauer eingrenzen, indem ich in Programm B nach Beenden von A etwa eine Sekunde warte: Interessanter Weise tritt dann der Fehler immer auf. Ich untersuch da grad eine Vermutung bzgl. der Flags bei CreateFile, mit denen die Dateien rausgeschrieben werden. B und A' liegen im mit GetTempPath ermittelten Verzeichnis und werden nämlich wirklich korrekt rausgeschrieben; kann man sogar im Explorer sehen.
_________________ 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 11.07.12 17:18
Was für Flags übergibst du denn?
Außerdem wäre ein FlushFileBuffers mal noch interessant, den Effekt hatte ich auch schon, dass ein anderer Prozess die Datei nicht gesehen hat, weil sie nur im Filecache existiert hat und noch nicht auf der Platte war. Eigentlich sollte das aber hinhauen, nachdem das Handle geschlossen wurde... 
_________________ "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."
|
|
BenBE 
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 11.07.12 17:29
_________________ 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 11.07.12 17:42
BenBE hat folgendes geschrieben : | Interessant ist ja, dass sie nicht mehr auf der Platte ist  |
D.h. sie ist erst da und dann nicht mehr?
Was sagt denn der Process Monitor, wer die löscht?
_________________ "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."
|
|
BenBE 
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 12.07.12 14:51
Entwarnung: Fehler wurde gefunden.
Ursache (ausreichend WTF bereithalten): Im Destruktor der Hauptprogramm-Klasse wurden die Überreste des letzten Updates aufgeräumt. Und seit sich die Anwendung durch einen Bugfix auch sauber beendet hat, ... Den Rest kann man sich denken.
_________________ 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.
Für diesen Beitrag haben gedankt: Narses
|
|
|