Allgemein


AllgemeinATLC++CRTDebuggingMFCProgrammierenVS-Tipps&TricksMartin Richter - Mo 27 Okt 2008 22:47

Probleme finden, die mit dem Heap zusammenhängen ist oft genug eine Sache für sich und für Anfänger nicht selten ein Buch mit sieben Siegeln. Die CRT und der Debugger stellen aber einige Werkzeuge zur Verfügung, die es einem doch mit etwas Geschick und Wissen erlauben auch komplexere versteckte Fehler zu finden, die Heapfehler auslösen.

Jeder C/C++ Entwickler hat schon Meldungen dieser Art beim Testen seiner Programme gesehen:

HEAP[CrashTest.exe]: Heap block at 006D7920 modified at 006D79B0 past requested size of 88
Windows has triggered a breakpoint in CrashTest.exe.
This may be due to a corruption of the heap, which indicates a bug in CrashTest.exe or any of the DLLs it has loaded. 

oder etwas in dieser Art:

Debug Error!
Program: …nts\Visual Studio 2008\Projects\CrashTest\Debug\CrashTest.exe
HEAP CORRUPTION DETECTED: after Normal block (#110) at 0x000D7948.
CRT detected that the application wrote to memory after end of heap buffer.

Ursache ist ein Fehler wie in diesem kleinen Beispielprogramm:

#include <windows.h>
#include <tchar.h>
#include <crtdbg.h>
int _tmain(int argc, _TCHAR* argv[]) 
{ 
  char *pCorrupt = new char[100];
  ZeroMemory(pCorrupt,106); // -- This will corrupt the heap 
  char *pOther = new char[100]; 
  ZeroMemory(pOther,100); 
  delete [] pOther; 
  delete [] pCorrupt; 
  return 0; 
}

Wenn die Debug-CRT benutzt wird erhält man automatisch einen Break im Debugger wenn der Speicherblock pCorrupt freigeben wird (Zeile 11). Man braucht also nur den Call-Stack oder Stacktrace anzusehen und kann zumindest feststellen, welcher Block defekt ist.

Schwieriger wird es dann schon die Stelle zu finden, an der der Block überschrieben wird. In meinem Beispiel also die Zeile 7. Besonders dann wird es komplex, wenn das Programm größer ist, und der Speicherblock an evtl. sehr vielen Stellen genutzt wird.

Um die Position einzugrenzen und nicht evtl. bis zum Programmende warten zu müssen, wenn man (hoffentlich) alle Objekte freigibt kann man die CRT veranlassen den Heap zu prüfen. Dies geschieht mit _CrtCheckMemory oder AfxCheckMemory.
Streut man also in seinem Code an strategisch guten Stellen das folgende Statement in seinen Code

ASSERT(AfxCheckMemory()); // oder _CrtCheckMemory

kann man relativ gut die Stelle einkreisen die den Fehler verursacht, und das ohne große Performanceverluste. Man erhält sofort einen ASSERT, ab dem Moment ab dem die Integrität des Heaps zerstört wurde und der Check durchgeführt wird.

Noch etwas einfacher ist es, die CRT dazu zu bringen sich sofort zu melden wenn der Heap zerstört wird. Dies kann man erreichen indem man das Debug-Flag _CRTDBG_CHECK_ALWAYS_DF setzt.

Platziert man bei Programmstart die folgende Codezeile in seinem Programm

_CrtSetDbgFlag(_CrtSetDbgFlag(0)|_CRTDBG_CHECK_ALWAYS_DF);

dann unterbricht die CRT das Programm sofort bei der nächsten Allokation eines Speicherbocks, nachdem der Heap zerstört wurde. In meinem Beispiel also direkt bei der nächsten Allokation in Zeile 8!
Nachteil ist, dass bei jeder Allokation der Heap geprüft wird und damit die Performance schon in den Keller gehen kann, wenn das Programm groß ist und der Fehler evtl. selten auftritt.

Man kann also mit den einfachen Bordmitteln der CRT einen Fehler schon relativ leicht eingrenzen.

Soweit für heute. Was man noch alles machen kann um effektiv Heap-Fehler zu finden werde ich demnächst noch in weiteren Artikeln zu diesem Thema beschreiben.

AllgemeinC++MFCVS 2008Martin Richter - So 19 Okt 2008 19:50

Wenn man die BCG-Library oder MFCNext aus der VC++ 9.0 SP1 nutzt erhält man einen ASSERT wenn man ein CScrollView verwendet und wenn das Programm maximiert gestartet wird.

—————————
Microsoft Visual C++ Debug Library
—————————
Debug Assertion Failed!

Program: …\Debug\TestSDIScrollView.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\viewscrl.cpp
Line: 385

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
—————————
Abbrechen   Wiederholen   Ignorieren  
—————————

Der Grund liegt darin, dass in der MFCNext Implementierung schon sehr früh ein RedrawWindow ausgeführt wird wenn das Main Window maximiert wird. In diesem Fall wird OnDraw/OnPaint bereits ausgeführt wenn SetScrollSizes noch nicht aufgerufen wurde. Das geschieht ja normalerweise meistens erst in OnInitialUpdate.
Dieser ASSERT soll dem Programmierer darauf hinweisen, dass SetScrollSizes unabdingbar für die korrekte Funktion des CScrollView notwendig ist.
Leider ist in diesem alten Code ein Seiteneffekt nicht berücksichtigt worden, der durch MFCNext in Spiel kam.

Das Ganze lässt sich jedoch einfach umschiffen indem man im Konstruktor seines Views vorab SetScrollSizes mit Dummywerten aufruft. Die eigentliche Initialisierung mag dann später wie gewohnt in OnInitialUpdate erfolgen.

CScriptEditorView::CScriptEditorView()
{
  // If the program is launched maximized, a RedrawWindow occurs in a very
  // early stage and OnDraw would be called without an initialized mapping mode
  // So we just do a dummy init here.
  SetScrollSizes(MM_TEXT,CSize(0,0));
}
AllgemeinInternetSoftwareMartin Richter - Mi 17 Sep 2008 20:24

Durch Zufall bin auf diesen uralten RFC aus dem Jahre 1996 gestoßen.
Man beachte das Datum der Veröffentlichung!
http://www.apps.ietf.org/rfc/rfc1925.html

Besonders stark finde ich Abschnitt (3) bzgl. der fliegenden Schweine 🙂

BTW: Eine Liste aller 1. April RFCs gibt es hier
http://www.apps.ietf.org/rfc/apr1list.html

AllgemeinInternetSoftwareMartin Richter - Mo 28 Jul 2008 08:14

Claim post für Technorati!
Technorati Profile

AllgemeinSoftwareSQLMartin Richter - Fr 08 Feb 2008 20:44

Bei einem Kunden muss ich aktuell einem Problem auf den Grund gehen, das irgendwie mit Locks in den tiefsten Tiefen des SQL-Server 2005 zu tun hat. Aus diesem Grund habe ich Einblick in den originalen – doch etwas größeren – Datenbestand erhalten. Besagter Kunde ist in seiner Branche ziemlich populär. Es werden in dieser Datenbank 750.000 Kunden verwaltet. Alles aktive Kunden eines bestimmten Produkts einer kleinen geographischen Zone in Deutschland. Qualitativ wirklich aktuelles Material, denn alle diese Datensätze sind wirklich aktive Kunden, d.h. bekommen mindestens einmal im Jahr eine Rechnung.

Um sich nun mit unserer Anwendung als Benutzer Administrator anzumelden benötigte ich noch ein Kennwort. Das hatte mir keiner mitgeteilt (bis jetzt). Aber was soll’s, probieren wir doch mal 😉

  1. Versuch: Der Firmenname
  2. Versuch: Der Produktname
  3. Versuch: admin… Bingo 😮

Ich will nicht davon reden, wieviele Aktivität betrieben wird,  die Datenbanken nach außen abzuschirmen. Auch will ich nicht über die interne Panik klagen, die uns gegenüber immer geschoben wird, dass alles hoch sicher und geheim zu behandeln ist.

Jeder Angestellte, mit etwas Spielwitz kann in etwa 20 Sekunden als Admin an alle Daten…

Nur als Anmerkung: Dieses Sicherheits-Problem ist natürlich mittlerweile behoben… :mrgreen:

AllgemeinChristseinReal LifeMartin Richter - Mi 30 Jan 2008 18:36

… dann ist man schon ein wenig stolz :mrgreen:

Katrin war am 25.+26.02.2008  im MDR1 Radio Sachsen mit Beiträgen zu hören.

Hier die Links zum Text:
Wort zum Tag – Sonnabend, 26. Januar 2008
Wort zum Tag – Freitag, 25. Januar 2008

Hier die Liste der Podcasts, einen direkten Link zu den Beiträgen habe ich hier leider nicht gefunden:
MDR1 Radio Sachsen: Wort zum Tag
Anmerkung: Da derMDR hier nur die letzten 14 Tage vorhält wird es nicht mehr lange dauern bis der Beitrag rausfällt.

AllgemeinMartin Richter - Di 13 Nov 2007 20:33

Gerade habe ich mein Blog Theme um das neue WordPress Feature Tag-Cloud (wp_tag_cloud) ergänzt.

Leider muss ich nun die Tags nacharbeiten. Mal sehen wann ich dazu komme. Bis dahin ist man eben auf die Kategorien angewiesen, die aber sicherlich mindestens genauso gut funktionieren. Tag-Clouds sind halt mehr in.

AllgemeinReal LifeSonstigesMartin Richter - Sa 06 Okt 2007 19:41

Blogpost for Burma

http://www.free-burma.org/

AllgemeinChristseinReal LifeMartin Richter - Di 02 Okt 2007 20:41

Seit Jahren leiden viele Kirchen und Gemeinden unter der Ignoranz der Medien. Gott, Glaube und Kirche sind keine Themen öffentlichen Interesses. Dieses „Blatt“ hat sich nun schlagartig gewendet. Hier sind einige Tipps, wie Sie mit Ihrer Gemeinde ganz schnell in die Schlagzeilen geraten. Ihre Gemeinde wird garantiert wieder wahrgenommen, wenn Sie diese Checkliste im Hinterkopf behalten.

  • Räumen Sie gegenüber der Presse ein, dass Sie im Kindergottesdienst die biblische Schöpfungsgeschichte erzählt haben.
  • Bekennen Sie sich freimütig dazu, im Konfirmandenunterricht über das Buch Genesis gesprochen und Vergleiche zwischen Kreationismus und Evolutionstheorie angestellt haben. Schämen Sie sich nicht.
  • Lassen Sie ehrlich raus, dass Sie immer noch das „Vaterunser“ beten und noch nicht auf „Mutterunser“ umgestiegen sind.
  • Schreiben Sie im Gemeindeblatt, dass in ihren Gottesdiensten „Ausländer“ willkommen sind. Man wird Ihnen eine Schlagzeile widmen. Schreiben Sie indes, Sie würden sich um Menschen mit „Migrationshintergrund“ kümmern, wird keine Zeitung von Ihnen Notiz nehmen.
  • Berichten Sie öffentlich, dass Ihre Gemeinde einen „Missionar“ ausgesandt hat. Die Presse wird über Sie herfallen . Bitte nicht „Entwicklungshelfer“ schreiben. Das wird nie eine Meldung.
  • Veröffentlichen Sie auf Ihrer Internet-Seite ein Seminar zum Thema „Mit Moslems über den christlichen Glauben reden“. Weil Sie nicht im Vatikan wohnen und auch nicht über eine Schweizer Garde verfügen, sollten Sie am besten gleich untertauchen.
  • Bestehen Sie darauf, dass der neue Küster Ihrer Gemeinde keiner anderen Religion angehören darf als der christlichen. Sie bekommen eine Schlagzeile. Suchen Sie sich einen guten Anwalt und achten Sie auf Menschen, die Koffer vor ihrem Gemeindezentrum stehen lassen.
  • Erwähnen Sie beiläufig, dass Sie am Ende einer Sportübertragung in ihrem Gemeindezentrum nach dem Sieg der deutschen Mannschaft die Nationalhymne gesungen haben. Schließen Sie abends besser die Fensterläden.
  • Berichten Sie ganz entspannt, dass Sie an Ihrem Gemeindefest eine Mohrenkopfwurfmaschine eingesetzt haben. Bleiben Sie danach lieber ein paar Tage in Deckung.
  • Räumen Sie gegenüber der Presse reumütig ein, dass die Jungs beim Pfadfinderlager in Uniformen aufgetreten sind und dass sich die Betreuer am Ende des Lagers mit herzlichen Umarmungen von den Kindern verabschiedet haben. Morgen werden Ihnen die Reporter auflauern.

So kommen Sie mit Ihrer Gemeinde garantiert in die Zeitung. So einfach ist heute kirchliche Öffentlichkeitsarbeit. Seien Sie bewusst politisch unkorrekt, dann kommen Sie endlich bald ins Fernsehen.

– Jürgen Mette „Stiftung Marburger Medien“

Gefunden auf der Homepage von Arno Backhaus!

AllgemeinReal LifeMartin Richter - Mi 07 Feb 2007 20:28

Das Büro in dem ich arbeite liegt in einem wunderschönen renovierten ehemaligen Kasernengebäude vom Anfang des letzten Jahrhunderts. Mit unserer Firma sind hier noch 5 andere Firmen und eine Gaststätte im Haus.

In der Nacht von Dienstag auf Mittwoch hat man bei 3 der Firmen eingebrochen, alles was nicht niet- und nagelfest war wurde mitgenommen. Insbesondere Computer, Flachbildschirme und Kopierer. Das Büro gegenüber, das über uns und das unter uns hat es erwischt. Einige schon zum dritten Mal, obwohl wir hier direkt an einer belebten Hauptstraße liegen mit der Polizei in Sichtweite.
Aber wen kümmert schon ein Kleinlaster mitten in der Nacht in den irgendwelche Leute irgendwas einladen.

Es war wieder einmal ernüchternd zu sehen wie notwendig Datenschutz wirklich ist. Die meisten Firmen haben auch Ihre aktuellen Daten mit samt Sicherung verloren, weil diese auch in den Räumen mit aufbewahrt wurde.

Datenschutz fängt wirklich bei der äußeren Hülle an (Tür+Alarmanlage) und geht strickt weiter über zentrale Datenhaltung (Raid5 System) und natürlich bis hin zu regelmäßigen Backups und externen Festplatten, die auch wirklich und garantiert nicht in den eigenen Räumen aufbewahrt werden!
Ja wissen tut es jeder, aber wer handelt auch wirklich danach?

Wer diese Büros und die frustrierten Mitarbeiter gesehen hat, die Ihre Arbeit von Wochen und Monaten verloren haben, der ist kuriert…

Es gibt eben auch notwendigen „Datenschutz“ 😉

« Vorhergehende SeiteNächste Seite »