C++DebuggingProgrammierenReal LifeMartin Richter - Mo 12 Jan 2015 18:57

Ein böser Bug.

Ich konnte ihn gerade noch in meiner Brotdose als Testfeld isolieren, bevor ich mit der Korrektur angefangen habe… :)

Und so sieht das ganze nun nach dem Fix aus… :8):

Der schwerwiegende Felhler nach dem Fix

Der schwerwiegende Fehler nach dem Fix

C++DebuggingProgrammierenVS 2010VS 2013Martin Richter - Sa 03 Jan 2015 11:54

Overlapped I/O ist eine Standardtechnik, die ja jeder kennt, der mit Datenquellen arbeitet, die “irgendwann” mal Informationen liefert, man aber in der Zeit evtl. noch anderes zu tun hat ;)

In meinem Fall, den ich hier schildere, benutzte unser Programm einen Service, mit dem es über Named Pipes kommuniziert. Das entsprechende Modul, ist schon ziemlich alt und hat seit ca. 3 Jahren keine Änderung erfahren. Aber jetzt auf einmal häuften sich Meldungen, dass unser Programm beim Beenden einen UAE auslöst.

Entsprechende Minidumps wurden angefordert und deren Analyse zeigte eigentlich nicht viel wirklich erhellendes.  Es sah alles danach aus, als ob ein Speicherblock freigegeben wird, der bereits freigegeben wurde.
Leider konnte das Szenario in unserem Testfeld nicht einfach nachgestellt werden. Und auch mehrfache Analyse des Sourcecodes brachte erst einmal nichts. Man ist manchmal einfach betriebsblind :(

Auffällig war aber, dass diese Meldungen erst vereinzelt auftraten nachdem unsere Software auf VS-2013 Update 3 umgestellt war und diese an Kunden ausgerollt wurde. Und weiterhin konnten wir feststellen, dass alle diejenigen, die diesen Fehler gemeldet haben, relativ leistungsfähige Rechner hatten.

Schließlich gelang es mir, das Szenario auf einem meiner Entwicklungsrechner nachzustellen.

Das passierte:

  1. Das Programm erhielt den Befehl zum Beenden.
  2. Irgendwann wurde auch dem Thread, der mit dem Service interagiert gesagt, dass er sich beim Dienst ausloggen soll.
  3. Der Dienst gibt auch brav den Befehl “Logoff” an den Service.
  4. Der Thread der in einer Schleife immer auf einen Response des Dienstes wartet beendet sofort.
  5. Und nun erfolgte der Crash.

Die Ursache war ein fehlender CancelIo. Damit das Beenden möglichst schnell vonstatten geht, wurde darauf verzichtet, auf eine Antwort des Services zu warten, ob der Logoff Befehl verstanden wurde, denn kurz danach wird sowieso die Pipe geschlossen. Keine gute Idee in diesem Fall! Das hatte auch den Grund darin, dass

Was ist also passiert :?:

  • Die OVERLAPPED Struktur für den Lesevorgang lag auf dem Stack innerhalb einer while Schleife, die auf verschiedene Events wartet.
  • Die Funktion in der diese Struktur deklariert war wurde aber bereits verlassen.
  • Wenn dann sehr schnell die Antwort des Dienstes kam, wurde in die alte Adresse der OVERLAPPED Struktur ein Wert verändert.
  • … und damit wurde der Stack an dieser Stelle zerstört.

Es waren in meinem Fall nur 4 Bytes und in manchen Fällen würde eine Rücksprungadresse verändert und es kam zum Crash. In anderen Fällen wurde Speicher verändert, der nicht mehr benutzt wurde. Das ganze passierte eben auch nur auf den Systemen, die sehr schnell auf die Antwort des Dienstes reagierten. Kam die Antwort spät genug, war die Änderung des Speichers nicht mehr gefährlich.

Der Fehler blieb jahrelang unentdeckt, weil scheinbar das Stacklayout, das durch den VS-2010 Compiler erzeugt wurde, gegen diesen Fehler unempfindlich war, weil nur Speicher verändert wurde, der nicht zu einem Fehler führte.

Was lerne ich daraus:
Wenn ich einen ReadFile mit OVERLAPPED verwende, sollte ich immer darauf achten, dass im Bedarfsfall auch dieser Vorgang abgebrochen wird durch ein CancelIo :!: Ein CancelIo mehr kann nicht schaden, wenn man den Block verlässt, in der eine OVERLAPPED Struktur definiert war.

CommunityProgrammierenMartin Richter - Mi 26 Nov 2014 18:08

Alle Jahre wieder. :D Es ist zwar schon ein paar Tage her, aber FedEx brauchte fast einen Monat (Jaaa!) bis ich meine kleine Award-Kiste aus den USA bekam.

Und wieder dachte ich: “Das wird diesmal wohl nicht langen!”´, aber es kam anders als ich dachte:

MVP Urkunde 2014

Das ist nun mein 16. Award als MVP für C++.

Ich war einer von 1.031 MVPs, die zum 1. Oktober Ihren Award erhalten haben und damit einer von ca. 4.000 in der ganzen Welt:
http://blogs.msdn.com/b/mvpawardprogram/archive/2014/10/01/congratulations-to-all-the-new-and-renewed-mvps.aspx

 

 

 

ProgrammierenSoftwareWindowsMartin Richter - Mo 11 Aug 2014 21:13

Man lernt nie, aus. In dem Fall betrifft es ein wenig die Batch-Programmierung mit CMD.EXE.

Für einen Batch, der einen Teil eine Datensicherung eines Hyper-V Servers machen sollte benötigte ich ein Verzeichnis mit dem Tagesdatum, aber im Format YYYY-MM-DD. %date war mir bekannt und auf unseren Rechner liefert das aber, DD.MM.YYYY.

Ein wenig Suche im Netz brachte mich zu Substring-Funktionen bei der Variablenersetzung, die ich noch gar nicht kannte. Hängt man hinter eine Variable Doppelpunkt und Tilde kann man Startposition und Länge eines Substrings angeben.

Entsprechend ist der Batch also ganz schnell geschrieben ;) :

SETLOCAL
SET TargetDir=D:\BackupHyperV %date:~6,4%.%date:~3,2%.%date:~0,2%
MD "%TargetDir%"
C++ProgrammierenWindows APIMartin Richter - So 03 Aug 2014 21:07

Ich habe ein Programm um COM-Automation erweitert. Der Test verlief super. Das Programm lief stand alone oder wurde über die Automation (CoCreateInstance) gestartet. Das Programm wurde im Installer integriert und ab da ging erst mal nichts mehr.

Wurde der externe COM Server über die Automation gestartet wurden auf einmal Satelite-DLLs nicht mehr gefunden. Das Programm ermittelte mit GetModuleFileName den Programmnamen. Ergänzte DEU zum Beispiel für die Deutsche Programmversion und suchte eine entsprechende DLL. Eigentlich ganz einfach. Das funktionierte aber nicht, weil GetModuleFileName den kurzen Dateinamen zurück gab. Also: aus PROGRAMM.EXE wurde PROGRA~1.EXE und Die Datei PROGRA~1DEU.DLL wurde gesucht, anstatt PROGRAMMDEU.DLL. Aber dann nicht gefunden…

Der Installer erzeugt scheinbar bei mir kurze Dateinamen in der Registrierung und auch MsiGetComponentPath, dass beim Start über CoCreateInstance konsultiert wurde, lieferte den kurzen Dateinamen.

Wirklich erstaunlich ist aber, dass der Name der in CreateProcess verwendet wurde auch später durch GetModuleFileName zurückgegeben wird. Wird also der kurze Dateiname beim Start verwendet, dann liefert GetModuleFileName einen kurzen Dateinamen.

Grundsätzlich kann man also nicht davon ausgehen, dass GetModuleFileName den langen Dateinamen zurück liefert.

InternetProgrammierenReal LifeSoftwareSonstigesMartin Richter - Mi 25 Jun 2014 20:35

Für den internen Gebrauch und Austausch mit einem paar Freunden benötigte ich eine Foren Software.

Also ging ich auf die Suche nach “Forensoftware nicht kompliziert, leistungsfähig, funktional, schnell, kostenlos”!

Meine Wahl viel letzten Endes auf SMF (Simple Machines Forum).
Ich kann nur sagen, dass die Wahl äußerst gut, war. Einrichtung und kleine Anpassungen waren im Nu durchgeführt. Eine Shoutbox habe ich auch noch gefunden und nun läuft dieses kleine geschlossene Forum wie eine 1.

Die ein oder zwei Fragen, die auftauchten waren schnell mit dem Online Handbuch bei SMF geklärt, oder es gab die entsprechende Antwort im Support Forum bereits.

PS: Ja klar. PhpBB war natürlich auch im Blickfeld, aber irgendwie hat mich dieser Dinosaurier nicht angelockt.  SMF erschien mir einfacher, kleiner kompakter, moderner und vor allem pflegeleichter.

 

AllgemeinMartin Richter - So 04 Mai 2014 17:39

Ein Fazit und eine kurze Zusammenfassung zu Anfang.

Um die 100 C++ Entwickler kamen dieses Jahr nach Garching zur ADC++, die von ppdev AG (Johannes Preishuber) mit einigen Sponsoren veranstaltet wurden.

Nach Johannnes Preishuber hat der Fußball (Champions League Halbfinale Bayern München – Real Madrid) einen kleinen Strich durch die Veranstaltung gemacht. Es war für viele Interessierte kein Hotelzimmer mehr in der Nähe verfügbar. Dadurch war die Teilnehmerzahl leider nur um die 100.

Lohnend war der Ausflug auf die Konferenz in jedem Fall. Zum einen um etwas über den Tellerrand zu schauen. Zum anderen um zwischen den Sessions auch Kontakte zu pflegen und auch fachlich mal zu erkunden was andere machen und wie andere etwas machen. Für mich sind das immer wieder kleine Aha-Erlebnisse.
Ich bin vielleicht etwas verwöhnt von den beiden ADC’s (2011 Prien am Chiemsee, 2012 Ohlstadt im Zugspitzland). In Bad Aibling 2013 war ich leider nicht dabei.

Die Location war nicht so malerisch. Der Konferenzort funktional, aber nicht ganz so gemütlich und schön.
Toll war in jedem Fall wieder die Abendveranstaltung, die in der Flugzeugwerft Schleißheim in toller Atmosphäre stattfand. Hier  lässt sich ppdev AG immer etwas Tolles einfallen. Mein Lob dafür!

Hier ein kleiner Bericht über die Sessions an denen ich teilgenommen habe.Je nach Struktur und Inhalt kann ich mehr oderweniger wiedergeben. Sollte ich Dinge falsch verstanden haben oder falsch wiedergeben, bitte ich das zu entschuldigen. Ich hoffe jedenfalls hier keine gravierenden Fehler in diesem Bericht gemacht zu haben.

Weiter lesen »

C++ProgrammierenVS 2013Martin Richter - Mi 02 Apr 2014 22:32

Mit dem neuen SQL 2014 der gestern veröffentlicht wurde kamen auch ein RC für Visual Studio 2013 Update 2. Dabei ist das Update 1 erst ende Januar heraus gekommen.
Das Update 2 für den TFS 2013 ist bereits veröffentlicht worden.
Siehe:  http://blogs.msdn.com/b/bharry/archive/2014/04/02/tfs-2013-2-update-2-released.aspx

Besonders gespannt bin ich auf die Linker Enchantements, die mit Update 2 kommen.
http://blogs.msdn.com/b/vcblog/archive/2014/03/25/linker-enhancements-in-visual-studio-2013-update-2-ctp2.aspx

Die Geschwindigkeit mit der aktuell Updates und Releases veröffentlicht werden ist geradezu verstörend. Man kommt kaum dazu sich auf eine Entwicklungsumgebung festzulegen und da ist schon das nächste Update, dass mit neuen Features Funktionen und Fixes reizt. :(

PS: Die Veröffentlichung von MS-SQL 2014 erinnert mich schmerzhaft, dass es nur noch 5 Jahre Support für OLE-DB gibt. Das ist noch einen traurigen Smiley wert :(

C++CommunityProgrammierenVS 2013Martin Richter - Mo 24 Mrz 2014 20:32

Wer das lange Wochenende zum 1. Mai auf ganz besondere Weise einleiten will, dem rate ich die ADC C++ Konferenz vom 29.-30.04.2014 in München zu besuchen.

Die Agenda enthält alt bekannte Themen, aber auch interessantes Neues. Nachdem mit C++x11, C++/RT wieder etwas Schwung in die Weiterentwicklung von C++ gekommen ist und auch die Geschwindigkeit in denen neue Compiler und Library Features veröffentlich werden beschleunigen, lohnt sich ein Blick über den Tellerrand.
Oft genug finden wir als Entwickler nicht die Zeit uns neuem zu widmen, dass bereits verfügbar ist oder in nächster Zeit verfügbar wird.

Veranstalter ist die ppedv AG (hinter der Johannes Preishuber steht). Ich habe die Konferenzen der letzten Jahre, an denen ich teilgenommen habe, immer in guter Erinnerung. Sowohl in der Auswahl der Themen und Redner, als auch in der exzellenten Durchführung, mit immer sehr schon gewählten Konferenzorten und Hotels.
Insofern lohnt sich sicherlich ein Blick in die Agenda.
Und ganz gespannt bin ich persönlich auf die Abendveranstaltung am Mittwoch, denn hier wird auf den ADC-Konferenzen den Teilnehmern immer etwas wirklich außergewöhnliches geboten.

Da ich letztes Jahr aus privaten Gründen leider nicht teilnehmen konnte freue ich mich dieses Jahr wieder dabei sein zu können; ,alte Kontakte beleben zu können, neue Entwickler kennen zu lernen und Neues aus der C++ Welt zu hören.

ADC

InstallationSoftwareWindowsMartin Richter - Mi 12 Feb 2014 20:57

Vor langer Zeit erschien es uns als gut einen SBS 2003 zu verwenden. OK. Es gibt Entscheidungen, die hat man getroffen und muss damit leben. Probleme gibt es eigentlich erst, wenn man alles anders machen will. :roll:

Wir wollten unseren SBS 2003 außer Betrieb nehmen und in eine normale Domäne umwandeln. Dazu alle Server virtualisieren etc. etc. Alles wurde neu eingerichtet, aber unser SBS 2003 war immer noch DER DC. Nachdem fast alle lebenswichtigen Dinge im Lauf der letzten Jahre und Monate schrittweise umgezogen waren, die mal auf der Kiste gelaufen sind (File-Server, Drucker-Server, Fax-Server, SQL-Sever, Exchange, RAS), blieb nur noch das AD übrig.

Nun einfach wäre es einen anderen Server als DC einzurichten kurz mal DCPromo aufrufen und gut ist es. Aber der SBS mag das ja gar nicht… :oops:
Sobald der SBS einen anderen DC entdeckt, dauert es nicht lange und er fährt einfach herunter. Zuerst mal war ich etwas baff, als eine Kollegin sagte sie käme an ein paar alte Ordner nicht mehr heran. Als ich in den Server Raum ging musste ich feststellen, dass die Kiste einfach so ausgeschaltet herumsteht.
Ich rechnete mit Fehlermeldungen aber nicht mit einem brutalen Shutdown.
Dokumentiert ist das natürlich auch in der MSDN hier. :!:

Etwas Recherche im Netz brachte dann die vorübergehende Lösung, mit der ich bis zur kompletten Abschaltung dieses Servers weiterarbeiten konnte.
In Kürze geht man wie folgt vor:

  • Den Prozess C:\WINDOWS\system32\sbscrexe.exe mit dem Sysinternals Prozess Explorer suspenden. Abschießen geht nicht, denn der Prozess startet sich sofort neu.
  • Im Regedit dem Administratoren Rechte auf den Ast HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SBCore geben. Das geht auch nicht bei laufenden Dienst, denn der entzieht einem sofort die Rechte wieder.
  • Danach die Anzeige aktualisieren mit F5 damit die verborgenden Untereinträge sichtbar werden.
  • Nun das DWORD Start von 2 auf 4 ändern. Dadurch wird der Dienst deaktiviert und startet nicht erneut.
  • Neustart und das war es erstmal.

Die Beschreibung findet sich auch hier.

So das war Schritt 1 und nun ging es darum den AD von diesem Rechner zu entfernen.
Also mal eben wie geplant DCPromo aufgerufen um das AD von diesem Rechner zu entfernen. Es wäre zu schön gewesen, wenn das nun einfach gegangen wäre. DCPromo verweigerte den Dienst mit der folgenden Meldung:

Die Verwaltung der Netzwerksitzung mit Dem-Tollen-Neuen-Server ist fehlgeschlagen.
Das Netzlaufwerk ist nicht erreichbar. Weiter Informationen

:???: Ich hatte vergessen, das dieser Server immer noch einen DNS Dienst hatte und in den Einstellungen der Netzwerkkarte wurde dieser Server auch noch verwendet. Die Fehlermeldung ist natürlich nicht zielweisend, wie so oft leider. Nachdem ich den neuen DNS Server in der Netzwerkkarte eingetragen hatte lief der DCPromo klaglos durch und zurück blieb ein normaler Windows 2003 Server.

Nachdem auch die letzten Dateien gesichert bzw. umgezogen waren und der Streamer ausgebaut wurde steht da nur noch ein kilo-schwerer Schrotthaufen, der jahrelang klaglos seinen Job gemacht hat.

Alter Server

Nächste Seite »