Archiv nach Kategorien: C++

Heap Error finden mit GFlags – Debug

Beim Entwickeln kann es schnell mal sein, dass ein Buffer ungewollt über den allokierten Bereich überschrieben wird. Um einen Fehler dieser Art zu finden, bieten sich Tools von Mircosoft an:

https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit

Hat man die Tools installiert geht man mit der Konsole an folgend Ort:
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86

dort ruft man
gflags.exe /p
auf, um zu sehen welche Programme (Binaries) gerade überwacht werden.

Als nächsten Schritt müssen wir unser Programm einfügen (mit absolutem Pfad), PATH ist zu ersetzen
gflags.exe /p /full /enable PATH

Jetzt starten wir die Debug-Gui aus dem gleichen Ordner (C:\Program Files (x86)\Windows Kits\10\Debuggers\x86) mit dem Namen
windbg.exe
Ist das Programm gestartet kann man entweder einen laufenden Prozess (nicht aus anderer Debugging-Umgebung, sondern direkt gestartet) auswählen oder den Prozess direkt mit dem Windows Debugger starten.
Für den zweiten Fall kann die Session mit F5 gestartet werden.

Sobald der Heap-Error auftritt wird der entsprechende Code im Debugger angezeigt und die betroffene Zeile markiert.

Zum Schluss sollte die Überwachung wieder beendet werden, dies geschieht mit
gflags.exe /p /full /disable EXECUTEABLE
wobei hier nur der EXECUTEABLE Name angegeben werden muss und nicht der komplette Pfad

Quellen

https://blog.kowalczyk.info/article/1j9/gflags-a-debugging-story.html
https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Silabs USBxpress :: SI_Open returns SI_DEVICE_NOT_FOUND

Um einen Silicon Labs EFM8 UB1 unter Windows 10 mit USBxpress zu betreiben muss man folgendes beachten:

Ist der Treiber in der richtigen Version vorhanden? Bei mir hat Windows automatisch den Treiber installiert, ganz ohne mein Zutun. Die Version (zu prüfen im Gerätemanger) war 3.2.0.0.
Leider ist diese Version viel zu alt, um mit dem Treiber 6.7.3.0 (Stand 11/2016) zusammenzuarbeiten. Wird der Treiber aktuallisiert, so funktioniert sofort der Befehl SI_Open und gibt nicht mehr SI_DEVICE_NOT_FOUND zurück.

SI OpenDriverVersion-264x300 in

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

SVN :: Backup and Restore Scripting

Hat man ein privates SVN Repository muss man sich auch selbst um ein Backup kümmern. Wird nicht vom ganzen Rechner ein Backup gemacht, so helfen kleine Scripte, die durch Crontabs gestartet werden. Zu diesem Zweck habe ich mir selbst ein kleines Script gebaut:

#!/bin/bash
backupDate=$(date +%Y%m%d-%H%M)
backupSrc="/svn"
backupDest="/svn/_BACKUP"
restoreScript="#!/bin/bash
sudo mkdir /$backupSrc
mkdir /$backupDest"

rm $backupDest/*
cd $backupSrc

for repo in *; do
        if [ "$repo" != "_BACKUP" ] ; then
                echo "backup: $repo"
                svnadmin dump $repo > $backupDest/$backupDate-$repo.svn.dump
                restoreScript="$restoreScript
sudo svnadmin create $backupSrc/$repo
sudo svnadmin load $backupSrc/$repo < $backupDate-$repo.svn.dump
"
        fi
done

cd $backupDest


restoreScript="$restoreScript
cd /
sudo chown -R www-data:subversion $backupSrc"
cd $backupDest
echo "$restoreScript" > restore.sh
chmod +x restore.sh

tar -cf $backupDate-svn.tar *.dump restore.sh

#copy
cp $backupDate-svn.tar /BACKUP/svn/

Will man noch sicherer sein, kann man das Backup mittels scp auch noch auf einen über das Internet erreichbaren PC speichern. Hierfür muss der RSA oder DSA Key noch auf dem Remote PC in die Datei „authorisized_keys“ eingetragen werden, und folgende Zeile im Script ergänzt werden:

scp -P PORT $backupDate-svn.tar USER@SERVER.de:/PFAD_ZU_BACKUP
VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

OpenCV :: Kinect VideoCapture data in IplImage

To use functions in OpenCV like cvSmooth or cvAdaptiveThreshold you must have the data of your VideoCapture in an IplImage object.

VideoCapture capture;
Mat grayImage;
IplImage *imgSrc, *imgResult;

imgSrc = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
imgResult = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);

capture.open(CV_CAP_OPENNI);
if (!capture.isOpened()) {
	cout << "Can not open a capture object." << endl;
	return -1;
}
capture.set(CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ);

for(;;) {
	if (!capture.grab()) {
		cout << "Can not grab images." << endl;
		return -1;
	}
	else {
		if (capture.retrieve(grayImage, CV_CAP_OPENNI_GRAY_IMAGE)) {
			imgSrc->imageData = (char *) grayImage.data;
			cvShowImage("Source", imgSrc);

			cvSmooth(imgSrc, imgResult, CV_BLUR, 100, 100);
			cvShowImage("Result", imgResult);
		}
	}
	if (waitKey(30) >= 0)
		break;
}
VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

OpenCV :: Convert Mat into IplImage

I’ve search long time for having result on this problem. I want to use the object of IplImage, which data should be filled from Mat. If you using the simple solution found on stackoverflow, then you can’t access the methods of the IplImage object.

Mat matImage;
IplImage iplImage;

iplImage = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
iplImage->imageData = (char *) matImage.data;
VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

LoadLibrary GetLastError 0x7E (126)

Beim Versuch eine als Release kompilierte DLL auf einem Rechner ohne Entwicklungsumgebung auszuführen kam es immer bei

LoadLibrary("name.dll");

wieder zu dem Fehler 0x7e (Das angegebene Modul wurde nicht gefunden).

Um dies zu beheben habe ich einfach mit dem dependency walker (http://www.dependencywalker.com) die DLL geöffnet und gesehen, dass die beiden Dateien msvcr100.dll und msvcr100d.dll fehlen.
Mein Projekt wurde auf Multithread-Dll (Release) kompiliert. Für mich kam die Möglichkeit, die DLL mit Unicode zu kompilieren nicht in Frage.

Gelöst habe ich das Problem auf eine sehr unschöne Art, aber eine mögliche.
Ich habe von meinem Entwicklungssystem die beiden DLLs genommen und auf den PC ohne Entwicklungsumgebung kopiert.
Ich sehe dieses Problem auf diese Weise noch nicht gelöst, aber vorerst tragbar. Bessere Lösungen sind sehr gerne willkommen!

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Eclipse :: undefined reference to sqrt

Wenn man versucht unter Linux mit Eclipse ein Programm mit gcc zu kompilieren und während des Kompilierens folgender Fehler auftritt

undefined reference to sqrt

muss man hier folgende Einstellung vom Linker ändern:

Project -> Properties -> C/C++ Build -> Settings -> Tool Settings (Tab) ->
GCC C Linker

jetzt unter Command folgendes einfügen (nach gcc, Leerzeichen nicht vergessen)

-lm

danach sollte alles funktionieren

VN:F [1.9.22_1171]
Rating: 4.0/5 (4 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

C/C++ unter Eclipse installieren

man muss g++, make und eclipse installieren, dann Eclipse starten und unter Help/Install New Software, bei work with folgenden Link auswählen:
http://download.eclipse.org/tools/cdt/releases/galileo

danach auf Add, alles herunterladen. Nach Abschluss der Installation Eclipse neu starten und es müsste alles funktionieren

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Borland: Parabel, Kreis

um eine Parabel zu zeichen braucht man folgenden Code:

Image1->Canvas->MoveTo(0,pow(-300,2)/100);
for (int i=0; iCanvas->LineTo(i,pow(i-300,2)/100);
}

für einen Kreis

Image1->Canvas->Ellipse(50,50,500,500);
VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Borland auf Option bei mehreren Objekten zugreifen

Manchmal möchte man auf eine Option von mehrern Objekten zugreifen, so kann man zum Beispiel ganz viele Buttons haben, die haben automatisch alle die Option „Tag“. Um jetzt auf diesen allgemein zuzugreifen, müssen alle bei „OnClick“ auf die gleiche Funktion verweisen, und in dieser Funktion muss folgender Code verwendet werden

((TComponent *)Sender)->Tag
VN:F [1.9.22_1171]
Rating: 1.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)