ATLC++MFCProgrammierenVS 2015Windows 10Windows 10Martin Richter - Fr 24 Feb 2017 15:29

Wer es schnell mag, kann gleich den Beitrag und technische Details auf Stack Overflow lesen:
http://stackoverflow.com/questions/41741448/random-crashes-on-windows-10-64bit-with-atl-subclassing

Hier möchte ich etwas ausführlicher, die Story dazu erzählen, eine Story aus dem ganz „normalen“ Leben eines Programmierers 😉

Letztes Jahr stellen wir in der Firma produktiv von VC-2013 auf VC-2015 um. Wir haben eine relativ große Anwendung, die im Kern, MFC und ATL verwendet. Unsere Anwendung zeigt Informationen in vielen Tabs und Dialogen an. Mehr als 256 Fenster sind da keine Ausnahme und eher die Regel als eine Seltenheit.

Unsere Anwendung erzeugt bei Crashes automatisch volle Dumps auch bei Kunden. Für unsere Qualitätssicherung ein Muss und ein Segen.
Bereits in der Alpha und Beta Phase hatten wir auf manchen Rechnern ein eigentümliches Phänomen. Unser Programm startete und erzeugte Fenster und auf einmal kam es zu einem Absturz bei oft ganz einfachen Windows API Funktionen, die ein Fenster verwendeten und die alle ausnahmslos letzten Endes dazu führten, dass eine Nachricht an ein Fenster gesendet wird. Der Stack war nichtssagend und schien zerstört. Die Dumps für die einzelnen User waren aber fast immer glich.
Das Problem trat in Release und Debug Builds auf.

Der Horror für jeden Programmierer. Nicht nachzuvollziehende Crashes auf manchen Rechnern. Heapfehler? Wilder Zeiger? Buffer-Overrun? Nichts was man gebrauchen kann… aber kein Analysetool was wir verwendeten schlug Alarm…

Nach Sammlung von mehreren Dumps waren die Crashes immer wieder an ähnlichen Stellen und fast immer alle sofort nach Programmstart. Betroffen in der Regel alles Windows 10 64bit Maschinen auf dem aktuellen Softwarestand, meistens hatten diese Maschinen 8GB und zum Teil weitaus mehr Speichern und es waren ausnahmslos schnelle Intel i7 verschiedener Generationen. Und in virtuellen Maschinen konnte ich das bisher nicht nachvollziehen.

Interessant, war, dass ich diese Crashes auch auf meiner Entwicklungsmaschine hatte. Manchmal…
Nach einigen Tests konnte ich sagen. Entweder tritt der Fehler auf und solange der Rechner gestartet ist kann man es manchmal nachvollziehen, oder der Fehler tritt eben nicht auf und man hat Ruhe vor ihm. Dann hatte ich mir 3 Tage hintereinander – ohne Rechnerneustart – mit Debug-Session auf Debug-Session eine Spur erarbeitet. Es war immer das 257 Fenster, dass gesubclassed wurde (mit ATL Thunking) oder erzeugt wurde (ATL Fenster), dass zum Crash führte.
Insofern war es bei jedem User auch immer ein ähnlicher Dump, weil der Fensteraufbau ja bei jedem User individuell war.

Am Ende des dritten Tages hatte ich einen Testcode, der den Fehler in der aktuellen Windows Session meines Rechners und meinen Programm zu 100% nachvollziehbar machte. Ich verschob den Testcode immer weiter in einem Programm nach vorne, bis ich bei InitInstance ankam.
Ups. Es liegt nicht an meiner Software.
Dann isolierte ich den Testcode in eine eigenes Programm und konnte den Bug in einem minimalen Sample nachstellen.

Zeit für einen Support-Case bei Microsoft und eine Anfrage auf stackoverflow.com (das war am 19.01.2017).

Mit dem Case hatte ich natürlich auch einen Workaround. Ich musste nur einfach die atlthunk.dll nicht benutzen und auch das ging mit einer einfachen Änderung in der atlstdthunk.h. (Auskommentieren des defines USE_ATL_THUNK2).

Die Kommunikation mit Microsoft gestaltete sich nicht einfach. Aber ich hatte zumindest einen konstruktiven MS Mitarbeiter aus Indien erwischt. Dumps konnte ich Microsoft liefern, auch den Crash direkt in einer Session zeigen. Code hatten sie auch, aber der Bug war bisher nicht bei Ihnen nachvollziehbar. Das trieb mich fast in die Verzweiflung. Natürlich musste alles andere ausgeschlossen werden.. Virenscanner, andere Software… etc…
Dennoch kein Repro auf eine Microsoft Maschine. Allerdings weiß ich nicht wie „intensiv“ da gesucht wurde.

Dann endlich ein Lichtblick auf stackoverflow.com. Eugene konnte den Bug nachvollziehen. Endlich.
Und nachdem ich wusste, dass es mit der bevorzugten Ladeadresse zu tun hatte, konnte ich auch meinen Code erweitern und mit 100% Wahrscheinlichkeit den Crash erzeugen.
Wenn also an der bisher bevorzugten Ladeadresse der atlthunk.dll kein Speicher zur Verfügung liegt und sofort wieder eine Relocation notwendig wird, dann kracht es. Lustig, da wir ja durch ASLR sowieso keine festen Ladeadressen haben, aber es gibt innerhalb einer Windows Session dennoch eine „bevorzugte Ladeadresse“.

Jetzt bin ich gespannt auf Microsoft…
Denn defakto kann jede Software die mit dem VC-2015 und VC-2017 Compiler und der ATL kompiliert wurde von diesem Problem betroffen sein.

PS: Man entschuldige mir Ungenauigkeiten oder auch falsche Begrifflichkeiten…
Bis heute habe ich den Fehler immer noch nicht ganz verstanden und ganz sooo tief lebe ich im Kernel von Windows doch nicht. 😀

PPS: Ich werden den Artikel auf stackoverflow.com aktuell halten.

AllgemeinMartin Richter - Sa 28 Jan 2017 09:54

Am 16. und 17. Mai 2017 wird diesmal im Microsoft Hauptquartier in München die nächste Advanced Developers Conference C++ stattfinden.

Hannes Preishuber und sein bewährtes ppedv Team richten wieder eine Konferenz zu C++ aus.
Ich bin gespannt was wohl diesmal an der Abendveranstaltung  am Dienstag geplant sein wird. Diese haben zumindest für mich ja schon fast einen „legendären“ 😉 Ruf und haben immer viel Spaß und Abwechslung geboten.

Neben dem (immer wieder guten) Social-Event bei dem man viele Kollegen treffen kann und darf, werden sicherlich wieder einige gute Vorträge über die nächsten Evolutionsstufen C++17 und C++20 zu erwarten sein. Und ich tippe mal das auch einige Microsoft Sprecher zu hören sein werden (wenn denn es schon bei Microsoft stattfindet). Ich bin gespannt was es vielleicht auch neues mit Microsoft in Verbindung mit C++ zu hören geben wird.

Mehr dazu unter dem Link http://adcpp.de/2017

 

HardwareSoftwareSonstigesMartin Richter - Fr 15 Jul 2016 16:18

Vor über 2 Monaten fing es an. Nach irgend einem Update konnte ich auf einmal die Kontoeinstellungen meines Google Accounts auf meinem Samsung S4 Active mit Android 5.01 nicht mehr erreichen. Einstellungen -> Konten -> Google und Crash, Anwendung wird angehalten.

Relativ schnell fand ich Leidensgenossen im Netz, denen es genauso geht. Der häufigste Kommentar der Experten war: „Warten auf ein neues Google-Play-Store Update“. Andere setzten tatsächlich ihr Handy zurück und machten die wildesten Klimmzüge. Resultat war: Nach dem nächsten Update lief es wieder nicht.

Bis dato war es mir erstmal egal, aber jetzt wollte ich doch eine Einstellung ändern. Also noch mal gegoogelt und gleich in mehreren Threads einen simplen Workaround gefunden, wie man doch an sein Konto kommt und den Tipp möchte ich Euch auch gerne zukommen lassen:

  • Einfach Gallerie App öffnen
  • Einstellungen auswählen
  • Und da findet man auch das verwendete Google Konto.

Hier stürzt nichts ab und man kann die entsprechenden Einstellungen vornehmen.

Siehe unter anderem hier und auch hier.

InstallationOfficeSoftwareMartin Richter - Sa 27 Feb 2016 12:21

Am Donnerstag Abend wunderte ich mich schwer. Auf einmal zeigte mein Outlook an, dass es noch 200 Emails herunterzuladen gäbe. Dann noch einmal 180. IWe ich leider feststellen musste warn alle diese Emails doppelt herunter geladen worden und erstreckten sich auf einen Zeitraum von ca. 2-3 Monaten. Eine Kontrolle ergab, dass es alle Emails waren, die noch bei meinem ISP in den Mailboxen lagen.

Zwei meiner Konten, die ich per POP3 ansteuere wurden in der Folge immer wieder herunter geladen. Ich vermutete erstmal einen Fehler bei meinem Provider, aber dem war nicht so. Zudem passierte das nun auch noch immer wieder mal. Eine Regel konnte ich nicht feststellen.

Erstmal machte ich mich ans Aufräumen. Also automatisches Abholen ausgeschaltet. Dann habe ich einfach die Spalte Geändert in der Listenanzeige in Outlook mit eingeblendet. Damit konnte ich sofort alle Emails ausmachen, die zuletzt heruntergeladen wurden. Einfach nach der Spalte sortieren und man hat alle Emails beisammen. Hat man allerdings Regeln wird es etwas komplizierter, aber hier kann die erweiterte Suche helfen. Die doppelten Emails waren dann auch schnelle gelöscht.

Nachdem ich die Google Suche nach dem Thema auf Einträge des letzten Monats eingeschränkt hatte, kam ich auch schnell zu einem Treffer in den Microsoft Communities im den englischen Foren sowie hier und auch in den deutschen Foren. Umstellen auf IMAP kam nicht in Frage und so versuchte ich die Lösung aus dem englischen Forum.

Ich musste feststellen, dass ich die neueste Version 16.0.6568.2025 auf meinem Rechner befand.

  1. Outlook Updates abstellen.
  2. Befehlszeile (CMD.EXE) als Admin ausführen.
  3. Dann folgenden Befehl ausführen:
"C:\Program Files\Common Files\microsoft shared\ClickToRun\OfficeC2RClient.exe" /update user updatetoversion=16.0.6366.2068

Die detaillierten Schritte, falls das alte Update nicht mehr im Cache sind finden sich hier unter Punkt 6.

Erstmal hat es nicht geholfen. Dann einen Neustart ausgeführt und anschließend war die Version 16.0.6366.2068 wieder installiert.
Jetzt verhält sich Outlook wieder korrekt.

Microsoft arbeitet angeblich an dem Problem. Ich werde die Threads mal beobachten und sehen was sich tut. Vorerst bleiben die Office Updates ausgeschaltet.

Nachtrag 29.02.2016:
Jetzt ist ein offizieller KB-Artikel dazu erschienen: https://support.microsoft.com/de-de/kb/3145116

SoftwareWindows 10Martin Richter - Sa 09 Jan 2016 11:50

Ich hatte relativ schnell nach Veröffentlichung von Windows 10 auch meinen Produktivrechner umgestellt. Hier war sowieso ein Hardwaretausch nötig und da ich Windows 10 schon auf meinem Laptop hatte und es mir gut gefiel, habe ich auch gleich neu installiert. Und ich habe es eigentlich auch nicht bereut.

Die Freude am neuen System währte exakt 2 Wochen und ich bekam nach Neustart des Rechners wegen eines Updates den folgenden Fehler. 🙁

Schwerwiegender Fehler Ihr Menü „Start“ funktioniert nicht. Wir beheben das Problem, sobald sie sich erneut anmelden.

                                                                                                                      Jetzt Abmelden 

Schwerwiegender-Fehler

Ich habe natürlich das Update deinstalliert aber das nützte mir nichts. Das Problem lag auch nicht am Rechner, sondern einzig an meinem Benutzerprofil, denn alle anderen Profile auf dem Rechner zeigten keine Probleme. Also war vermutlich auch das Update nicht die Ursache. 😕
Nachdem ich einiges ausprobiert hatte was auch so im Internet dazu stand, habe ich einfach den Microsoft Support angerufen (wir hatten sowieso noch 5 unbenutzte Cases).  Leider hat der Support auch zu keiner Lösung gefunden. Damals habe ich also einige Daten aus dem Profil gesichert und mein Benutzerprofil auf dem Rechner entfernt und neu angelegt.

Das ganze ging jetzt Monate gut (auch nach dem Update 1510) und ich dachte: OK Problem scheint behoben.
Pustekuchen: Diese Woche war es wieder so weit. Der gleiche Fehler. Wieder Suche im Internet was im letzten Monat zu diesem Fehler heraus kam. Und siehe da… ein neuer Tipp: Dropbox ist die Ursache?

Kein Hexenwerk. Also Dropbox deinstalliert Rechner neu gestartet und siehe da. Der Fehler ist weg. Allerdings auch der Root Eintrag im Explorer für OneDrive.
Da ich die Dropbox aber täglich benötige habe ich die Software gleiche wieder installiert. Überraschung: Kein Fehler. 🙂
Auch der Root Eintrag im Explorer für DropBox war nun weg. Aber die Ordner funktionieren und sind erreichbar. Damit kann ich leben. (Evtl. finde ich wenn ich Zeit habe auch hierfür noch eine Lösung).
Fazit in meinem Fall: In diesem Szenario von Dropbox in Verbindung mit Windows 10 scheint was nicht zu passen, was bei mir (vermutlich bereits zweimal) einen Fehler auslöste.

Vielleicht hilft es anderen. Denn ein Profil neu aufzubauen mit allen Einstellungen macht nicht unbedingt viel Spaß, selbst wenn man einen Registry Auszug und eine Kopie alle Daten hat.

Nachtrag 11.01.2016:
Gestern hatten wir auf einem Rechner unserer Kirchengemeinde ein ähnliches Problem mit der folgenden Meldung:

Schwerwiegender Fehler. Das Menü Start und Cortana funktioniert nicht. Wir bemühen uns, das Problem bis zur nächsten Anmeldung zu beheben.

Jetzt Abmelden

In diesem Falle half ein anderer Tipp, der mittlerweile auch im Netz schon mehrfach geteilt wurde.

  1. STRG + ALT + Entf Tasten drücken.
  2. Jetzt die Umschalt-Taste drücken und mit der Maus auf das Power-Symbol klicken und Herunterfahren auswählen.
  3. Die Umschalt-Taste gedrückt halten bis Windows 10 komplett heruntergefahren wurde.
  4. Den PC erneut und hoffen, dass der Fehler diesmal behoben ist.

Bei diesem Problem kann ich nicht sagen, ob es am Profil liegt. Der Rechner hatte nur eines und dieses war mit einem Microsoft-Konto verbunden.

InstallationProgrammierenSoftwareSonstigesMartin Richter - Fr 08 Jan 2016 16:23

Ihr seid vielleicht auch betroffen und nutzt bisher Code Signing für Eure Software oder MSI Pakete.
Ich zumindest habe von Symantec (ehemals Verisign) für unsere Zertifikate zum Jahresende eine Email bekommen, die mir empfiehlt zukünftig sowohl SHA1 als auch SHA256 zu nutzen. Entsprechende Links wurden mitgeliefert. (1) (2)(3)(4)

Ich habe also erstmal das bisherige Codesigning SHA1 Zertifikat als SHA256 Zertifikat neu ausgeben lassen. Das ganze war kostenlos über die Symantec Seite möglich und dauerte letzten Endes höchstens 30 Minuten.

Dann habe ich das neue Zertifikat im Produktionsserver installiert.
In unserem Produktionsprozess ist das Codesigning integriert. Die entsprechenden Dateien liegen in einem Quellordner und werden von unserem Produktionserver verwendet um daraus unsere Installationspakete oder Hotfixes zu generieren. Dabei werden alle Dateien entsprechend automatisch signiert.

Die entsprechende Code Passage in unserem Batch sah bisher so aus:

>signtool sign -sha1 FingerPint-SHA1-Zertifikat -fd sha1 -t http://timestamp.verisign.com/scripts/timstamp.dll myexe.exe

Da dachte ich: OK Ganz einfach, also nur eine zweite Zeile mit dem Parameter -as hinzufügen und das neue Zertifikat angeben.
Aber Pustekuchen:

>signtool sign -as -sha1 FingerPint-SHA256-Zertifikat -fd 256 -t http://timestamp.verisign.com/scripts/timstamp.dll myexe.exe
Done Adding Additional Store
SignTool Error: SignedCode::Sign returned error: 0x80070057
        Falscher Parameter.
SignTool Error: An error occurred while attempting to sign: AGVIP.exe

🙁 Nach einigem hin und her probieren und Lesen einiger Artikel, musste ich feststellen, dass die Ursache einzig und alleine in dem angegebenen Timestamp Server liegt. Der Verisign Timestamp Server mag einfach keine SHA256 Zertifikate für das Gegenzeichnen.

Die Lösung war also einfach. Ich habe einen anderen Timestamp Server benutzt und nun sehen die Befehlszeilen einfach so aus.

>signtool sign     -sha1 FingerPint-SHA1-Zertifikat   -fd sha1   -tr http://timestamp.geotrust.com -td sha1   myexe.exe
>signtool sign -as -sha1 FingerPint-SHA256-Zertifikat -fd sha256 -tr http://timestamp.geotrust.com -td sha256 myexe.exe

Und siehe da 🙂 alles funktioniert bestens und meine Programme haben nun 2 Zertifikate.

HardwareMartin Richter - Sa 28 Nov 2015 12:16

Längst überfällig bin ich mit der Digitalisierung meiner Familienvideos. Für die alten VHS und VHS-C Aufnahmen habe ein Capture Device von Elgato, was auf einfache Weise macht was es soll.

Aber meine digitale Panasonic DS990 Kamera würde ich gerne direkt anschließen. Mein Nero Video Capture erlaubt mir zwar die Kamera zu bedienen, aber es kommt weder Ton noch Bild an. Einfach nur schwarzes Bild. Wechseln des Kameratreibers brachte nichts.
Ich erinnere mich, das ich das Problem vor Jahren mit Windows 7 auch schon hatte. Da gehörte ein 1394 Legacy Treiber zum Installationssatz und mit dem lief auch meine Panasonic. In Windows 10 finde ich das aber nicht. Zudem hatte ich damals noch 32bit und heute natürlich eine 64bit Installation.

Etwas Recherche in im Netz brachte mich zu dieser Seite:
http://support.microsoft.com/en-us/kb/2970191

OK. Was in Windows 8 und 8.1 geht auch in Windows 10. Also Treiber herunter geladen und installiert. Das brachte aber keinen Erfolg. Ich konnte den Treiber auch nicht nicht auswählen. Also habe ich das MSI-Installationspaket mit meinem SpeedCommander entpackt und finde in der 64bit Versi0n sowohl 32bit als auch 64bit Treiber.

Nun das ganze nochmal:

  • Gerätemanager gestartet.
  • IEEE 1394 ausgewählt.
  • Treiber aktualisieren
  • Auf dem Computer nach Treibersoftware suchen
  • Pfad angeben mit dem extrahierten Treiber
  • Und dann den Legacy Treiber auswählen.

Siehe da. Nun läuft auch mein Capture mit Nero und meiner Panasonic Mini-DV perfekt.

In der Liste der installierten Treiber kann ich nun den Firewire Port mit dem neuen und dem Legacy Treiber wahlweise betreiben.

InstallationOfficeSoftwareMartin Richter - Mi 07 Okt 2015 19:39

Heute musste ich einen neuen/alten Laptop für unseren Vertrieb fertig machen. Darunter musste ich auch Office 2016 Plus installieren. Und da sind mir doch gleich ein paar Dinge sehr negativ/eigentümlich aufgefallen.

  1. Es gibt nur noch eine gemischte x86/x64 Version
  2. Kaum hatte ich das ISO Image gemounted und starte das Setup, beginnt auch schon die Installation. Das will ich doch eigentlich nicht. Auf diesem Laptop würde ich gar nicht alles installieren wollen. Es erfolgt keine Frage wohin ich installieren will. Nix.
    Das kann es ja wohl nicht sein.
  3. Ich könnte eine Wette abschließen, dass die Verzeichnisstruktur, die gewählt wurde ein Bug im Setup ist. Installiert wurde bei mir die 32bit Version (woher weiß das Setup, dass ich die wollte?)! Das Ziel Verzeichnis ist C:\Program Files (x86)\Microsoft Office\root\Office16, aber ein fast leeres C:\Program Files (x86)\Microsoft Office\Office16 Verzeichnis gibt es auch. Und eigentlich sehe ich unter dem root Verzeichnis wieder einiges was früher einfach unter C:\Program Files (x86)\Microsoft Office\ lag.

Wie kann es sein, dass man ein Setup nicht mal mehr so baut, dass ich ohne extra Programm entscheide wohin und was installiert wird? Unfassbar….

CommunityProgrammierenMartin Richter - Di 22 Sep 2015 20:34

Alles hat seine Zeit… (Prediger 3,1)

Eine kleine Ära geht für mich zu Ende. Vor kurzem erhielt ich von Microsoft die Information, dass ich dieses Jahr nicht neu zum C++ MVP nominiert werde.

Seit 2000 bis einschließlich 2014 habe ich diesen Titel insgesamt 16 mal erhalten. Über den Sinn und Zweck dieser Ehre mag man streiten. Stolz bin ich trotzdem drauf. Und gerade weil es mir mit anderen MVPs auch gelungen ist doch manchmal etwas Dampf und Druck zu machen. Z.B. damals für eine längere XP-Unterstützung, die wurde in VS-2012 Update 1 dann nachgeliefert. Obwohl ich klar sagen muss, dass die grundsätzliche Möglichkeit Einfluss zu nehmen in den letzten Jahren immer weiter abgenommen hat.

Hauptgrund ist sicherlich meine eingeschränkte Online Aktivität und auch meine nunmehr eingeschränkte Blog-Aktivität. Und um ehrlich zu sein: Ich hatte es irgendwann erwartet.

Meinen Blog werde ich deshalb nicht einstampfen und auch Online werde ich noch hier und da anzutreffen sein.
Also wird sich so viel für Euch gar nicht ändern… 😎

C++CRTProgrammierenVS 2015Windows APIMartin Richter - Fr 18 Sep 2015 16:15

Eine „Spaßbremse“ Software mit Visual Studio 2015 auszuliefern war bisher in jedem Fall das Universal CRT.

Im Speedproject.de Blog ist davon auch einiges zu lesen gewesen:
Noch kein Umstieg auf VS-2015
Anwendungslokaler Einsatz der Universal CRT
Visual Studio 2015 und die Universal CRT

Dieses Paket musste man zusätzlich mit installieren auf allen Systemen die Windows 7, Vista oder Windows 8.x verwendet haben. Die Probleme und das Nachfragen von Entwicklern hat nun Wirkung gezeigt.
Microsoft veröffentlicht den KB2999226 über Windows Update. Damit entfällt das Ausrollen mit dem eigenen Setup.

angeboten bzw. installiert wurde.

Danke für den Hinweis an Michael Külshammer. (siehe auch dotnetpro)

Nachtrag:
Bei mir erscheint jetzt auf meinen Windows 7 Rechner das entsprechende Update als optionales Update
KB2999226

Nächste Seite »