Forum: PC-Programmierung C++ Speicherfehler finden


von Klaus (Gast)


Lesenswert?

Moin!

Ich programmiere an einem größeren Projekt in C++ mit MS Visual Studio.

Leider gibt es gelegendlich Speicherzugriffsfehler. Das dumme an der 
Sache: Der Debugger steigt irgendwo an einem Punkt aus, nachdem schon 
alles zerschossen ist. Der Stack scheint total im Eimer zu sein, denn es 
lässt sich nichtmal ein vernünftiger Callstack anzeigen, um zu sehen, 
welche Funktion gerade ausgeführt wurde.

Wie kann man dem nun auf die Spur kommen? Gibt es Tools die zur Laufzeit 
überwachen, dass nur in allozierten Speicher geschrieben wird und 
ähnliche Fehler?

von g457 (Gast)


Lesenswert?

_CrtCheckMemory() [1] kann helfen, bremst (abhängig von den 
Einstellungen) allerdings ∗massiv∗. Augen zu und durch.

Wenn man Glück hat dann kommt man mit Binärsuche am ehesten zum Ziel. 
Das muss aber nicht immer (insbesondere bei Nebenläufigkeiten) korrekt 
funktionieren.

HTH und Viel Glück!

[1] http://msdn.microsoft.com/en-us/library/e73x0s4b%28v=vs.100%29.aspx

von Sven P. (Gast)


Lesenswert?

Geht es denn um MS-Müll oder ließe sich das auch mit einem gcc 
übersetzen? Dann nämlich könntest du mächtigere Werkzeuge benutzen, etwa 
valgrind oder gdb mit Rückwärts-Debuggen.

von Peter II (Gast)


Lesenswert?

Sven P. schrieb:
> Geht es denn um MS-Müll oder ließe sich das auch mit einem gcc
> übersetzen?
sehr schlechte Idee, denn schon das ändern des compiler kann den fehler 
teilweise komplett verschwinden lassen oder andere auftrauchen lassen.

Kein tool kann erkennen wenn du innerhalb deines Speichers andere Daten 
überschreibst. Sie können maximal erkennen wenn du über ein array 
hinausschreibst und sie dort eine Guardpage angelegt haben.

Ich würde den quellcode einfach noch mal genauer anschauen, es dürfte 
bei C++ doch nicht so viele stellen geben wo man mit pointern arbeitet.

Sind denn auch Thread beteiligt, ist das verhalten nachvollziehbar? 
Passiert also bei den gleichen startbedingungen immer das gleiche?

von Hase (Gast)


Lesenswert?

Hallo,

beachte doch die Tipps zum Debugging von Martin Richter in seinem Blog 
(blog.m-ri.de). Zur Not musst du den ApplicationVerifery einsetzen.

Viel Erfolg,
Hase

von Sven P. (Gast)


Lesenswert?

Peter II schrieb:
> Sven P. schrieb:
>> Geht es denn um MS-Müll oder ließe sich das auch mit einem gcc
>> übersetzen?
> sehr schlechte Idee, denn schon das ändern des compiler kann den fehler
> teilweise komplett verschwinden lassen oder andere auftrauchen lassen.
Nein, sehr gute Idee. Wenn möglich, Quelltext genau aus diesem Grund von 
verschiedenen Compilern übersetzen lassen.

> Kein tool kann erkennen wenn du innerhalb deines Speichers andere Daten
> überschreibst. Sie können maximal erkennen wenn du über ein array
> hinausschreibst und sie dort eine Guardpage angelegt haben.
Es gibt aber Werkzeuge, die kaputte Stapelrahmen erkennen. Und genau 
dann wäre es schön, das Programm von dort an rückwärts durchlaufen zu 
können.

> Ich würde den quellcode einfach noch mal genauer anschauen, es dürfte
> bei C++ doch nicht so viele stellen geben wo man mit pointern arbeitet.
Guter Witz :-}
Und du glaubst, mit den Templates kann man sowas nicht produzieren...? 
Es reicht schlimmstenfalls schon ein vergessenes 'virtual' aus.

von Peter II (Gast)


Lesenswert?

Sven P. schrieb:
> Guter Witz :-}
> Und du glaubst, mit den Templates kann man sowas nicht produzieren...?
> Es reicht schlimmstenfalls schon ein vergessenes 'virtual' aus.
damit überschreibt man meines wissens aber nicht andere Daten, kann es 
nur passieren das man aus einen ungültigen speicherbereich daten lesen 
will. Und das zeigt der Debugger gleich an der stelle an.

von Sven P. (Gast)


Lesenswert?

Peter II schrieb:
> Sven P. schrieb:
>> Guter Witz :-}
>> Und du glaubst, mit den Templates kann man sowas nicht produzieren...?
>> Es reicht schlimmstenfalls schon ein vergessenes 'virtual' aus.
> damit überschreibt man meines wissens aber nicht andere Daten, kann es
> nur passieren das man aus einen ungültigen speicherbereich daten lesen
> will. Und das zeigt der Debugger gleich an der stelle an.

Denkst du.
Du wirst erstaunt sein, was z.B. ein falscher Destruktor oder ein 
ungültiger Iterator so alles anrichten können.

von Nico S. (nico22)


Lesenswert?

Vor allem durch erase invalidierte Iteratoren katapultieren dich direkt 
in die Hölle, wenn du in ner For-Loop weiteriterierst.

von Klaus (Gast)


Lesenswert?

Sven P. schrieb:
> Geht es denn um MS-Müll oder ließe sich das auch mit einem gcc
> übersetzen? Dann nämlich könntest du mächtigere Werkzeuge benutzen, etwa
> valgrind oder gdb mit Rückwärts-Debuggen.

Es geht nicht zwingend um MS-Müll, aber damit arbeite ich halt zur Zeit. 
Den MS-Müll halte ich, im Gegensatz zu dir, für die beste IDE und den 
besten Debugger, den es gibt ;-)  Naja, aber alles kann der halt auch 
nicht.

Aber der Code ist portabel und auch per GCC übersetzbar. Valdrind war 
auch der erste Name, der mir als Tool in den Sinn gekommen ist. Leider 
scheint es das nicht für Windows zu geben.

g457 schrieb:
> _CrtCheckMemory()

Schon mal ein Anfang. Wobei das ja nur nach Heap-Fehlern sucht.

Hase schrieb:
> ApplicationVerifery

Den Application Verifier aus dem Visual Studio hab ich auch ausprobiert. 
Leider läuft das Programm damit nicht richtig. Da kommen Funktionen aus 
einer DLL, die Speicher anfordern sollten, mit NULL zurück. Hab ich noch 
nicht genauer untersuchen können, warum das so ist.

Sven P. schrieb:
> Es gibt aber Werkzeuge, die kaputte Stapelrahmen erkennen.

Habend die Werkzeuge auch Namen und laufen auf Windows? ;-)

von Andreas B. (andreasb)


Lesenswert?

Peter II schrieb:
> Sven P. schrieb:
>> Geht es denn um MS-Müll oder ließe sich das auch mit einem gcc
>> übersetzen?
> sehr schlechte Idee, denn schon das ändern des compiler kann den fehler
> teilweise komplett verschwinden lassen oder andere auftrauchen lassen.

Ja, wenn man Visual Studio streicht kann der Fehler ziemlich schnell weg 
sein;-)

Visual Studio kann durchaus mal eine Debug Version aus versehen mit der 
Release Version Linken, dann wird jeder std::string verhauen, oft auch 
der Stack...

Wenn die Applikation aus mehreren Teilen besteht mal die Übergänge 
Debuggen, und wenn sich plötzlich die Werte ändern: Dann hast du den 
Fehler;-)

Welche Version vom VS?

> Kein tool kann erkennen wenn du innerhalb deines Speichers andere Daten
> überschreibst. Sie können maximal erkennen wenn du über ein array
> hinausschreibst und sie dort eine Guardpage angelegt haben.

Natürlich gibt es Tools die das können, es werden einfach 
Metinformationen zu den Daten hinzugefügt.
Ich glaube Valgrind kann das auch, natürlich geht sowas aber mit MS 
Visual Studio nicht.

> Ich würde den quellcode einfach noch mal genauer anschauen, es dürfte
> bei C++ doch nicht so viele stellen geben wo man mit pointern arbeitet.

@Peter II
Es gibt Leute die schreiben auch etwas grössere Applikationen als du, 
wenn du mehr als 3 Klassen verwenden, dann kann es durchaus viele 
Stellen geben bei denen ein Fehler möglich wäre.

> Sind denn auch Thread beteiligt, ist das verhalten nachvollziehbar?
> Passiert also bei den gleichen startbedingungen immer das gleiche?

Wenn Ja: Kannst du mit diesen Informationen Debuggen, dann findest du 
heraus wo das es abschmiert.

Wenn nicht: Dir bleibt wohl nichts anderes übrig als entweder ein 
entsprechendes Analysetool zu verwenden, oder du baust massenweise 
Logzeilen ein.


mfg Andreas

von Andreas B. (andreasb)


Lesenswert?

Peter II schrieb:
> Sven P. schrieb:
>> Guter Witz :-}
>> Und du glaubst, mit den Templates kann man sowas nicht produzieren...?
>> Es reicht schlimmstenfalls schon ein vergessenes 'virtual' aus.
> damit überschreibt man meines wissens aber nicht andere Daten, kann es
> nur passieren das man aus einen ungültigen speicherbereich daten lesen
> will. Und das zeigt der Debugger gleich an der stelle an.

Kommt darauf an. Der Debugger springt erst an wenn der Fehler schon 
längst passiert ist, und wenn da der Stack weg ist kann er dir auch 
nichts mehr anzeigen.

Der Debugger weiss dann nämlich NICHT wo die Applikation zuletzt war. 
Woher auch?

Kann bei C++ durchaus mal vorkommen...



mfg Andreas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nur mal so am Rande gefragt: Die verschiedenen Runtime-Checks, die die 
CRT bieten kann, sind auch alle aktiviert? Die finden sich z.B. unter 
den "Code Generation"-Optionen und WIMRE auch irgendwo bei den 
Linkeroptionen. Gerade auf diesem Gebiet sind die neueren VC-Versionen 
erheblich besser geworden als das steinalte VC6.

Welche Version wird hier verwendet?

von Nico S. (nico22)


Lesenswert?

... oder ist das einfach nur ne nicht gefangene Exception? Durch Stack 
Unwinding ist da für den Debugger tatsächlich nichts mehr zu holen. 
Abhilfe: Testweise mal einen Breakpoint auf alle Exceptions setzen. Wie 
das im Visual Studio genau geht, weiß ich aber nicht.

von Sven P. (Gast)


Lesenswert?

Klaus schrieb:
> Sven P. schrieb:
>> Geht es denn um MS-Müll oder ließe sich das auch mit einem gcc
>> übersetzen? Dann nämlich könntest du mächtigere Werkzeuge benutzen, etwa
>> valgrind oder gdb mit Rückwärts-Debuggen.
>
> Es geht nicht zwingend um MS-Müll, aber damit arbeite ich halt zur Zeit.
Siehe unten. Ich meinte damit nicht die IDE, sondern das API, MFC und 
was es da sonst noch an Scheußlichkeiten gibt :-)

> Den MS-Müll halte ich, im Gegensatz zu dir, für die beste IDE und den
> besten Debugger, den es gibt ;-)  Naja, aber alles kann der halt auch
> nicht.
Oha.. Du solltest dich echt mal umschauen :-}

Andreas hat das Problem ja beschrieben: Prinzipiell überbügelst du einen 
Zeiger und es kracht erst später, wenn der Zeiger gebraucht wird. Als 
Beispiel. In solchen Fällen (schrieb ich oben auch schon) ist der gdb 
wirklich gut, denn er kann das Programm vom Crash an rückwärts 
ausführen.
Das könnte eventuell auch zu einer Lösung führen.


> Aber der Code ist portabel und auch per GCC übersetzbar. Valdrind war
> auch der erste Name, der mir als Tool in den Sinn gekommen ist. Leider
> scheint es das nicht für Windows zu geben.
Schau mal dort nach:
http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows

> Sven P. schrieb:
>> Es gibt aber Werkzeuge, die kaputte Stapelrahmen erkennen.
>
> Habend die Werkzeuge auch Namen und laufen auf Windows? ;-)
Naja, gdb zum Beispiel wird dann ziemlich böse. In der Regel reicht aber 
die Debug-Option von gcc schon, damit es scheppert.

von XTerminator (Gast)


Lesenswert?

Sven P. schrieb:
> Geht es denn um MS-Müll

Man sieht, daß du ein professioneller Entwickler bist, der stets nur 
objektive Kriterien in seine Überlegungen einfließen läßt.

von XTerminator (Gast)


Lesenswert?

Peter II schrieb:
> es dürfte
> bei C++ doch nicht so viele stellen geben wo man mit pointern arbeitet

Nein, natürlich nicht. Klar, nur über Zeiger kann man Polymorphie 
nutzen, aber das macht man in C++ ja auch nie...

von XTerminator (Gast)


Lesenswert?

Andreas B. schrieb:
> Visual Studio kann durchaus mal eine Debug Version aus versehen mit der
> Release Version Linken, dann wird jeder std::string verhauen, oft auch
> der Stack...

Nein, das macht VS nicht, das macht der Benutzer, der etwas falsch 
einstellt.

Geht mit deinem geliebten gcc aber mindestens ebenso leicht.

Können die ganzen Kindergartenkinder sich jetzt mal bitte verziehen?

von debugger (Gast)


Lesenswert?

Vielleich ganz altmodisch : Programmteile deaktivieren (auskommentieren) 
und prüfen, wie sich das auswirkt.

von Mark B. (markbrandis)


Lesenswert?

Klaus schrieb:
> Ich programmiere an einem größeren Projekt in C++ mit MS Visual Studio.
>
> Leider gibt es gelegendlich Speicherzugriffsfehler. Das dumme an der
> Sache: Der Debugger steigt irgendwo an einem Punkt aus, nachdem schon
> alles zerschossen ist. Der Stack scheint total im Eimer zu sein, denn es
> lässt sich nichtmal ein vernünftiger Callstack anzeigen, um zu sehen,
> welche Funktion gerade ausgeführt wurde.

Auch wenn ein Tool zur statischen Codeanalyse den Fehler in Deinem 
speziellen Fall vielleicht nicht finden kann: Verwendest Du ein solches 
Tool? Wenn nein, würde ich dies tun, und die vom Tool gemeldeten Fehler 
und Warnungen einfach mal nicht ignorieren :-)

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Im VS:

Debug -> Exceptions -> Win32 Exceptions -> Access Violation

einschalten. Bei einer Access Violation hält er dann da, wo sie 
auftritt, und nicht erst da, wo es crashed.

Anmerkung:
> Geht es denn um MS-Müll
Ich arbeite täglich mit dem MS VC2010, und möchte es nicht missen. Schon 
gar nicht mit irgendwelchen zusammengestückelten gnu Sachen, bei denen 
erst mal "alles zum Laufen bringen muss".

von Karl H. (kbuchegg)


Lesenswert?

Speicherfehler und Memory Leaks muss man von Anfang an mitbeobachten und 
gleich korrigieren. Diesen Prozess rauszuzögern bringt nichts, es macht 
alles nur noch komplexer. Unittests sind hilfreich.

Bei VC++ gehört ans Anfang in jedes File gleich mal

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

rein, damit dir die Runtime selbst hilft, derartige Problemstellen zu 
detektieren und zu finden.


Wobei man in C++ durch die konsequente Nutzung des RAII Idioms gute 
Chancen hat, diesem Problemkreis relativ leicht zu entkommen.
RAII bedeutet Resource Aquisition Is Initialization
In einer Kurzfassung auf die wesentlichste Auswirkung reduziert: Eine 
Klasse soll 1 Resource und nur 1 Resource dynamisch verwalten. Benötigt 
eine Klasse mehrere dynamische Dinge, dann wird für jedes davon eine 
eigene Klasse fällig, die sich nur um die Verwaltung dieses 1 
dynamischen Teils kümmert. Copy Konstruktoren, operator= und 
Destruktoren der zusammenfassenden Klasse werden dann sehr einfach bzw. 
können überhaupt vom Compiler generiert werden.

Auch immer bewusste machen: Welche Pointer sind 'owning-Pointer', welche 
sind 'non-owning'. Ein owning Pointer ist einer, der für die Verwaltung 
zuständig ist. Sein Job ist es, die Resource am Ende ihrer Lebensdauer 
zu zerstören. Non-owning Pointer haben dieses Recht nicht. Daraus folgt 
sofort eine mehr oder weniger Grundregel: die Klasse die eine Resource 
allokiert, ist auch dafür zuständig, sie zu zerstören. Ein anderes 
Objekt kann vielleicht einen Pointer darauf halten, aber sie hat nicht 
das Recht an der Allokierung selbst rumzupfuschen.

Die "Rule of Three" beachten:
Benötigt eine Klasse eine eigene Version der Funktionen
  * Destruktor
  * Copy Konstruktur
  * Operator =
dann ist es sehr wahrscheinlich, dass sie alle 3 benötigt. Will man Copy 
Constructor bzw. Operator= nicht implementieren, dann muss man sie 
wenigstens für den Compiler/Linker unbrauchbar machen um sich als 
Programmierer selbst vor eine unbeabsichtigten Verwendung zu schützen. 
(private deklarieren und nicht implementieren)

const-korrektes Arbeiten ist auch etwas, das einem manchmal fehlerhafte 
Verwendungen aufzeigt. Auch hier gilt: von Anfang an durchziehen. const 
im Nachhinein einziehen zieht oft Rattenschwänze an Codeänderungen nach 
sich. Die sind zwar meistens unkomplizierte Editiersession aber Zeit 
kosten sie trotzdem.

ASSERT reingeben. Assertions können manchmal Probleme aufzeigen, die 
sich noch nicht zum Desaster ausgewirkt haben. Ziel: Das Programm selber 
soll anzeigen, dass da etwas nicht stimmt. Und zwar unabhängig davon, ob 
der Aufrufer Fehlercodes auswertet oder nicht. Ein Out of Bounds Zugriff 
in ein Array ist ein Fehler! Selbst wenn eine Funktion den übergebenen 
Index prüft und im Fehlerfall die Operation mit einem Fehlercode 
abbricht, soll ein ASSERT diesen Fehler im Debugger unmissverständlich 
melden, denn er weist oft auf ein grundlegenderes Problem beim Aufrufer 
hin.

Und ganz wichtig:
Nimm das Prinzip der Datenkapselung ernst!
Eine Klasse, die Pointer auf ihre Daten rausgibt, kann schon der erste 
Sargnagel sein.


Solange die generelle Programmstruktur nicht zu verkorkst ist, kann man 
viele Dinge auch im Nachhinein noch mit einem entsprechenden Aufwand 
nachrüsten. Meistens lohnt sich das sogar, da die Analyse von 
Stack-Traces auch einiges an Aufwand bedeutet und man mit der Kentniss, 
wo welche Operation schief gelaufen ist, ja noch nicht unbedingt eine 
Abhilfe dagegen hat.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rufus Τ. Firefly schrieb:
> Die verschiedenen Runtime-Checks, die die
> CRT bieten kann, sind auch alle aktiviert?

Präzisiert:

/RTCc (smaller type check)
/RTC1 bzw. /RTsu (stack frames, uninitialized variables)
/GS (buffer security check)

von Sven P. (Gast)


Lesenswert?

XTerminator schrieb:
> Sven P. schrieb:
>> Geht es denn um MS-Müll
>
> Man sieht, daß du ein professioneller Entwickler bist, der stets nur
> objektive Kriterien in seine Überlegungen einfließen läßt.
Ich bin zumindest so erfahren, dass ich mir MSVC++ nicht mehr antue und 
Windows als Entwicklungsplattform abgeschrieben habe. Ist ja echt kaum 
mehr zumutbar als primäre Plattform. Ohne tonnenweise nachinstallierte 
Tools schon garnicht.


Ich kann Karl-heinz einfach nur beipflichten. Insbesondere was den 
ersten Absatz angeht.
Wenn bei uns im Team ein 'Speicherfehler' auffällt, ist augenblicklich 
Entwicklungsstopp, bis die Ursache gefunden und einwandfrei behoben ist. 
Entweder läuft ein Programm stabil oder garnicht und es geht nicht an 
den Kunden -- ein 'in seltenen Fällen kann..' ist nicht akzeptabel.
Das führt einzig zu Frust beim Kunden.

Die tragische Erfahrung aus der Praxis zeigt dann aber, dass es leider 
allzuoft einen Zusammenhang zwischen Speicherfehlern und 
Progarmmierer(n) gibt. Das merkt man insbesondere, wenn man ein Projekt 
übernimmt oder einem Projekt neu beitritt.
Zumindest bei kleineren Projekten muss man spätestens nach dem zweiten 
oder dritten Fehler schon ganz scharf nachdenken, ob ein Rewrite nicht 
günstiger ist. Denn dann ist die Qualität oft schon abgesoffen und die 
Gefahr viel zu groß, beim Nachbessern was zu vergessen.
Das hat dann ungefähr den Charakter wie 1/x: Mit unverhältnismäßigem 
Entwicklungs- und Debugaufwand konvergiert immer langsamer gegen 
Fertigstellung, wird aber effektiv doch nie auf eine befriedigende Weise 
fertig. Ein klassisches 'Leiche-im-Keller'-Syndrom :-}

Da helfen dann wieder Kapselung und Einheitentests weiter. Wenn man die 
richtig anpackt, funktionieren die sogar, ohne esoterisch zu eskalieren.

von Mark B. (markbrandis)


Lesenswert?

Sven P. schrieb:
> Ich bin zumindest so erfahren, dass ich mir MSVC++ nicht mehr antue und
> Windows als Entwicklungsplattform abgeschrieben habe.

Wenn die Entwickler fehlerhaften Code schreiben, ist dann der Compiler / 
die Entwicklungsumgebung / das Betriebssystem dran schuld?

Sooooooo schlecht, wie manche sie gerne hätten, sind Compiler und IDE 
von Microsoft jetzt auch wieder nicht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mark Brandis schrieb:
> Wenn die Entwickler fehlerhaften Code schreiben, ist dann der Compiler /
> die Entwicklungsumgebung / das Betriebssystem dran schuld?

Selbstverständlich. Wer denn sonst?

> Sooooooo schlecht, wie manche sie gerne hätten, sind Compiler und IDE
> von Microsoft jetzt auch wieder nicht.

Man könnte sogar sagen, daß das eines der wenigen tatsächlich 
brauchbaren Produkte ist, auch wenn MS sich redlich Mühe gibt, das zu 
ändern. Das Fenster- und vor allem Maushandling in VS2010 ist eine 
mittlere Katastrophe, der native Compiler und der Debugger hingegen sind 
vorzüglich, auch wenn man auf das unnötige .Net-Geraffel verzichtet.

Schön wäre es, wenn es eine von diesem Geblubber befreite reine C- und 
C++-Variante des VS2010 gäbe.

Ärgerlich und peinlich ist die nach wie vor fehlende C99-Unterstützung.

von micha (Gast)


Lesenswert?

Eventuell kann VLD "Visual Leak Detector" (ist glaube ich noch nicht 
genannt worden, homepage http://vld.codeplex.com/) auch noch ein paar 
gute Hinweise geben. Ist Freeware und hat mir schon sehr geholfen!

von Karl H. (kbuchegg)


Lesenswert?

Rufus Τ. Firefly schrieb:

> ändern. Das Fenster- und vor allem Maushandling in VS2010 ist eine
> mittlere Katastrophe, der native Compiler und der Debugger hingegen sind
> vorzüglich,

Jep.
Seit sich Herb Sutter des C++ Compilers angenommen hat, hat der einen 
steilen Qualitätssprung hingelegt. Man kann MS viel vorwerfen, aber ihr 
C++ Compiler gehört sicherlich mit zu den Besten, die es gibt.

(und das .Net Geraffel nehm ich bei C++ sowieso nicht ernst. Ich träum 
ja immer noch davon, dass es irgendwann eine funktional gleichwertige 
Lib in nativ C++ gibt. Denn eines muss man schon sagen: Die .Net Lib ist 
sauber aufgebaut und ordentlich durchdesigned. Nicht so wie die MFC, zu 
deren Ehrenrettung man nur sagen kann: Anfang der 90-er Jahre war der 
C++ Compiler halt noch lange nicht soweit um ein eleganteres Design zu 
erlauben)

von Vlad T. (vlad_tepesch)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das Fenster- und vor allem Maushandling in VS2010 ist eine
> mittlere Katastrophe

Was stört dich denn?
ich finde es ganz gut.
Das einzige, was mich nervt, ist dass man im Gegensatz zu früher, die 
Watchfenster nicht größer machen kann, als den Ausschnitt, den man 
gerade sieht.

im VS2005 gabs dann halt einen Scrollbalken, so dass man zur Not auch 
den längsten, verschachteltsten Template-Typ lesen konnte.
Jetzt muss man erst das Fenster ausdocken.


Rufus Τ. Firefly schrieb:
> Ärgerlich und peinlich ist die nach wie vor fehlende C99-Unterstützung.
warum, der Standard ist doch noch nicht mal 12 Jahre alt ;)

von Karl H. (kbuchegg)


Lesenswert?

Vlad Tepesch schrieb:
> Rufus Τ. Firefly schrieb:
>> Das Fenster- und vor allem Maushandling in VS2010 ist eine
>> mittlere Katastrophe
>
> Was stört dich denn?

Mich stört zb das 'Property' Fenster. Ganz besonders im Resource-Editor.
Ich fand die alten Dialoge übersichtlicher und besser in der Bedienung, 
vor allen Dingen wenn es darum ging, Handler an Controls zu binden.
Und wie ich in der MFC an einen Dialog mit dem Wizzard eine OnInitDialog 
anhängen kann hab ich auch noch nicht rausgefunden :-)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Seit sich Herb Sutter des C++ Compilers angenommen hat, hat der einen
> steilen Qualitätssprung hingelegt.

Wann war das ungefähr?

> Man kann MS viel vorwerfen, aber ihr C++ Compiler gehört sicherlich
> mit zu den Besten, die es gibt.

Ist das so? Ich habe das eher so in Erinnerung:

Früher nahm man den GCC, wenn man kein Geld hatte und den MSC, wenn man
schnellen Code erzeugen wollte.

Der GCC holte aber mit den Oprimierungen stark auf, so dass man mit dem
MSC keine Geschwindigkeitsvorteile (eher Nachtteile) hatte. MSC wurde
fortan hauptsächlich deswegen verwendet, weil man Visual Studio wollte
und der MSC eben hübsch integriert mitgeliefert wurde.

Der GCC hatte zusätzlich den Vorteil, dass er sich immer stark am je-
weils gültigen Standard orientierte, was aber natürlich für Windows-
Only-Programmierer kein so starkes Argument ist. Trotzdem hat hier der
MSC inzwischen aufgeholt.

Dann kam der Intel-Compiler und hat sowohl GCC als auch MSC weggefegt,
was die optimierte Codegenerierung betrifft. Da er aber ordentlich
kostet, wird praktisch nur im professionellen Bereich und dort haupt-
sächlich im Heigh-Performance-Computing eingesetzt.

Den Intel-Compiler würde ich als den aktuell mit Abstand stärksten
Compiler für PCs ansehen, MSC und GCC folgen mit Abstand auf etwa
gleichem Niveau.

Ich verwende den MSC seit ein paar Jahren kaum noch, mag sein, dass er
in dieser Zeit wieder kräftig zugelegt hat, deswegen meine Frage von
oben bzgl. Herb Sutter.

von XTerminator (Gast)


Lesenswert?

Yalu X. schrieb:
> Den Intel-Compiler würde ich als den aktuell mit Abstand stärksten
> Compiler für PCs ansehen, MSC und GCC folgen mit Abstand auf etwa
> gleichem Niveau.

Nur für Intel-CPUs, für andere CPUs optimiert er nicht nur nicht 
richtig, sondern erzeugt sogar absichtlich pessimierte Codepfade.

von Rolf Magnus (Gast)


Lesenswert?

Vlad Tepesch schrieb:
> Rufus Τ. Firefly schrieb:
>
>> Ärgerlich und peinlich ist die nach wie vor fehlende C99-Unterstützung.
>
> warum, der Standard ist doch noch nicht mal 12 Jahre alt ;)

Das ist nicht die aktuelle Version, sondern die bereits veraltete, seit 
Ende letzten Jahres nicht mehr gültige. Und schon die ist noch nicht mal 
auch nur annähernd umgesetzt.

von Peter II (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Und schon die ist noch nicht mal
> auch nur annähernd umgesetzt.

das doch mal bitte was ihr von dem Standard so dringend braucht, ich 
hatte zumindest noch nichts vermisst.
Oder geht es euch nur um die datentypen uint8_t usw. das kann man ja zum 
glück selber lösen.

von Karl H. (kbuchegg)


Lesenswert?

Yalu X. schrieb:
> Karl Heinz Buchegger schrieb:
>> Seit sich Herb Sutter des C++ Compilers angenommen hat, hat der einen
>> steilen Qualitätssprung hingelegt.
>
> Wann war das ungefähr?

Das muss so ungefähr um 2004, 2005 rum gewesen sein. Nagle mich da jetzt 
aber nicht auf 2 oder 3 Jahre auf/ab fest.

>
>> Man kann MS viel vorwerfen, aber ihr C++ Compiler gehört sicherlich
>> mit zu den Besten, die es gibt.
>
> Ist das so? Ich habe das eher so in Erinnerung:

Es ist so.
MS hat enorme Anstrengungen in den Compiler gesteckt um ihn 
standardkonform zu machen.

von XTerminator (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Ärgerlich und peinlich ist die nach wie vor fehlende C99-Unterstützung.

Das wird sich auch nicht ändern, MS hat schließlich erklärt, daß sie gar 
nicht mit C99 planen und C++ als Sprache der Wahl ansehen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vlad Tepesch schrieb:
>> Das Fenster- und vor allem Maushandling in VS2010 ist eine
>> mittlere Katastrophe
>
> Was stört dich denn?

Versuch mal was mit dem Scrollrad anzufangen. Das lässt sich nur mit 
Aufwand reparieren, denn MS hat teilweise erheblichen Aufwand getrieben, 
um das Scrollrad nutzlos werden zu lassen (Beispiel: Debugfunktion 
"Attach to remote process", Auswahl des Prozesses in der Listbox. Die 
scrollt überhaupt nicht).

Glücklicherweise gibt es Tools, die das komplett kaputte 
Scrollradhandling beheben, hier insbesondere XMBC
http://www.highrez.co.uk/downloads/XMouseButtonControl.htm

Desweiteren ist das Verhalten der diversen Popupfensterchen extrem 
lästig, die sich vor den Quelltext schieben und da nur mit Gewalt 
wegzubekommen sind. Auch beeindruckend ist die hartnäckige Unfähigkeit, 
mit "goto definition" an eine Codestelle zu springen und die dann auch 
im jeweiligen Fenster anzuzeigen. Das jedenfalls tut VS2010 nicht, wenn 
man sich die Freiheit nimmt, mehrere Sourcecodefenster gleichzeitig 
sehen zu wollen (und nicht die komplett retardierte standardmäßige 
"Workbook"-Variante nutzt).

Letztlich nutze ich zum Arbeiten mit VS2010 drei Monitore, den in der 
Mitte für das eigentliche Arbeiten und die beiden rechts und links davon 
für die zig Zusatzfensterchen, die mir sonst den Blick auf den Quelltext 
versperren wollen.

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Versuch mal was mit dem Scrollrad anzufangen.

es ging um den c99 standard - nicht um das VS

also das scollrad unter VS2003 geht ohne Problem in dem remote-dgp 
fenster - im 2010 muss ich nachher mal testen - viel mir noch nie auf 
das das nicht geht.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Karl Heinz Buchegger schrieb:
>>> Man kann MS viel vorwerfen, aber ihr C++ Compiler gehört sicherlich
>>> mit zu den Besten, die es gibt.
>>
>> Ist das so? Ich habe das eher so in Erinnerung:
>
> Es ist so.
> MS hat enorme Anstrengungen in den Compiler gesteckt um ihn
> standardkonform zu machen.

Dass der MS-Compiler inzwischen weitgehend standardkonform ist, habe ich
noch mitbekommen und oben auch geschrieben. Aber hat er in den letzten
Jahren auch bei der Optimierung/Codegenerierung zugelegt? Mein letzter
Stand ist der, dass er dabei mit dem GCC etwa gleichauf war.

XTerminator schrieb:
>> Den Intel-Compiler würde ich als den aktuell mit Abstand stärksten
>> Compiler für PCs ansehen, MSC und GCC folgen mit Abstand auf etwa
>> gleichem Niveau.
>
> Nur für Intel-CPUs, für andere CPUs optimiert er nicht nur nicht
> richtig, sondern erzeugt sogar absichtlich pessimierte Codepfade.

Das ist natürlich zu befürchten. Vielleicht bringt ja AMD mal einen
Compiler auf den Markt :)

Rufus Τ. Firefly schrieb:
> Ärgerlich und peinlich ist die nach wie vor fehlende C99-Unterstützung.

Mal ganz ehrlich: Wer programmiert unter Windows noch in C? Das sind
doch höchstens solche, die Software für ein Fremdsystem (bspw. einen µC)
entwickeln und komplexe Module vorab auf dem PC testen wollen. Aber das
sind sicher nicht die Kunden, die MS mit dem Visual Studio ansprechen
will.

von Sven P. (Gast)


Lesenswert?

Yalu X. schrieb:
> Mal ganz ehrlich: Wer programmiert unter Windows noch in C? Das sind
> doch höchstens solche, die Software für ein Fremdsystem (bspw. einen µC)
> entwickeln und komplexe Module vorab auf dem PC testen wollen. Aber das
> sind sicher nicht die Kunden, die MS mit dem Visual Studio ansprechen
> will.
Klar.

Das ist bzw. war (zumindest für mich) halt richtig interessant für 
portable Projekte. Mittlerweile nehme ich überall nur noch den GCC, weil 
der deutlich komfortabler zu bedienen ist, als VC.

Was mich an Windows als Entwicklungsplattform viel mehr stört, ist der 
ganz banale alltägliche Umgang damit. Frisch installiert ist das einfach 
nicht mehr zumutbar:
. Nerviges Startmenü,
. unübersichtlicher Explorer (Hierarchie-Linien!),
. keine gescheite Konsole,
. Skripte auch nicht (und nein, DOS-Batch ist lachhaft...),
. keine Archivprogramme (Zip, Tar, ...),
. nix um Dateien zu vergleichen/vereinigen,.
 kein brauchbarer Editor für mal grade in einen Quelltext zu gucken, 
ohne MSVC anzuschmeißen,
. ...

Bis das alles mal in der Reihe ist, habe ich unzählige Programme 
nachinstalliert. Meistens hau ich gleich MinGW mit VIM drauf und hab 
Ruhe.

Nun, zurück zum Thema?

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Versuch mal was mit dem Scrollrad anzufangen. Das lässt sich nur mit
> Aufwand reparieren, denn MS hat teilweise erheblichen Aufwand getrieben,
> um das Scrollrad nutzlos werden zu lassen (Beispiel: Debugfunktion
> "Attach to remote process", Auswahl des Prozesses in der Listbox. Die
> scrollt überhaupt nicht).
so ich habe es mal getestet, sie scollt. Hätte mich auch gewunder wenn 
nicht.

Sven P. schrieb:
> Was mich an Windows als Entwicklungsplattform viel mehr stört, ist der
> ganz banale alltägliche Umgang damit. Frisch installiert ist das einfach
> nicht mehr zumutbar:
> . Nerviges Startmenü,
was ist daran nervig?

> . unübersichtlicher Explorer (Hierarchie-Linien!),
ich komm mit dem linux zeug auch nicht klar, explorer ist ok

> . keine gescheite Konsole,
was kann an einer konsole falsch sein, oder meinst du eine shell?

> . Skripte auch nicht (und nein, DOS-Batch ist lachhaft...),
wenn man will gibt es die powershell

> . keine Archivprogramme (Zip, Tar, ...),
zip ist standardmäßig dabei

> . nix um Dateien zu vergleichen/vereinigen,.
comp zum vergleich - aber gehört das etwas zu einem Betriebssystem? Es

Es gibt ausreichend programme dafür.

>  kein brauchbarer Editor für mal grade in einen Quelltext zu gucken,
notepad kann so ziemlich jeden quelltext anzeigen die ich je hatte. Wenn 
es dir nicht reicht Kann du jeden anderen editor installieren - wie bei 
linux auch.

> ohne MSVC anzuschmeißen,
also jetzt auch noch zu faul ein programm zu starten.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Yalu X. schrieb:
> Mal ganz ehrlich: Wer programmiert unter Windows noch in C?

Ich mach das, weil ich einige wirklich sehr alte Projekte weiterpflege. 
Da das keine GUI-Anwendungen sind, sondern Dienste bzw. andere 
Hintergrundprozesse, ist das auch nicht sonderlich schlimm.
Diese Projekte habe ich vor knapp 20 Jahren für die damals erscheinende 
erste ernstgemeinte Windows-Version angefangen zu entwickeln. Und die 
war, bereits in den ersten Beta-Versionen, ein ganz erheblicher 
Fortschritt gegenüber dem 16-Bit-DOS-Gefrickel, auch wenn die 
Oberfläche, äh, grässlich war.

Interaktive Anwendungen würde ich ums Verrecken nicht in C schreiben 
wollen -- es ist allerdings sehr lehrreich, es mal getan zu haben, weil 
erst dann man verstehen kann, warum auch so etwas wie die MFC ein 
Fortschritt sein kann.

Ich würde auch heutzutage die oben erwähnten Programme nicht mehr in C 
schreiben wollen, aber ich konnte damals schlichtweg kein C++, und die 
mir zur Verfügung stehenden C++-Compiler waren damals auch eher sehr 
lausig.

Da ich Windows als Entwicklungsplattform in absehbarer Zeit nicht 
verlassen können werde, werde ich damit leben müssen, mit Windows zu 
arbeiten.

Und ich gehöre zu den Menschen, die IDEs bevorzugen, auch wenn die auf 
jedem System wieder anders sein mögen.

Peter II schrieb:
> also das scollrad unter VS2003 geht ohne Problem

Tja, VS2003 ist auch was ganz anderes als VS2010, da waren immerhin 
zwei Versionen dazwischen. Daher sind Vergleiche sinnarm.

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Tja, VS2003 ist auch was ganz anderes als VS2010, da waren immerhin
> zwei Versionen dazwischen. Daher sind Vergleiche sinnarm.

ich habe es gerade mit VS2010 getestet - es geht dort.

von Peter II (Gast)


Lesenswert?

Version 10.0.40219.1 SP1Rel

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> ich habe es gerade mit VS2010 getestet - es geht dort.

Und Du hast auch exakt verstanden, welches Fenster und welche Liste 
darin ich meine?

von lanai (Gast)


Lesenswert?

Peter II schrieb:
> Rufus Τ. Firefly schrieb:
>> Versuch mal was mit dem Scrollrad anzufangen.
> es ging um den c99 standard - nicht um das VS
Nö, hier existieren, wie in fast jedem Thread, mehrere Diskussionen 
parallel vor sich hin.

Peter II schrieb:
>> . unübersichtlicher Explorer (Hierarchie-Linien!),
> ich komm mit dem linux zeug auch nicht klar, explorer ist ok
Das erklärt deine Beißreflexe, wenn es einer wagt etwas gegen MS zu 
sagen. ;-)

von Peter II (Gast)


Angehängte Dateien:

Lesenswert?

Rufus Τ. Firefly schrieb:
> Und Du hast auch exakt verstanden, welches Fenster und welche Liste
> darin ich meine?
denke schon

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> denke schon

Sieht so aus. Genau das funktioniert auf meinem System (W7x64) nicht, 
bzw. nur mit zusätzlichen Hilfsmitteln wie o.g. XMouse Button Control.
Selbst nach einem direkt in die Liste klicken scrollt das Mausrad diese 
Liste nicht. Die einzige Möglichkeit ist das "Anfassen" des 
Scrollbalkens bzw. das daraufherumklicken.

Allerdings verwende ich auch den Standardmaustreiber und nicht das 
obszön aufgeblähte Maustreiberbubufunzpaket des Mausherstellers (hier: 
Logitech).

Das Verhalten hat übrigens auch der Hersteller o.g. Maustools bestätigt 
und sein Werkzeug eigens auf diese Eigenheit angepasst.

Dieses Maustool ist sowieso erforderlich, weil das Standardverhalten von 
Windows im Umgang mit dem Scrollrad sowieso äußerst beknackt ist 
(Scrollnachrichten landen im Fenster, das den Mausfocus hat, und nicht 
in dem Fenster, über dem sich der Mauszeiger befindet).

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Sieht so aus. Genau das funktioniert auf meinem System (W7x64) nicht,
hier 32bit - aber SP1 vom Studio installiert

> Allerdings verwende ich auch den Standardmaustreiber und nicht das
> obszön aufgeblähte Maustreiberbubufunzpaket des Mausherstellers (hier:
> Logitech).
ich auch nicht, maus wird angsteckt und gut ist.

> Dieses Maustool ist sowieso erforderlich, weil das Standardverhalten von
> Windows im Umgang mit dem Scrollrad sowieso äußerst beknackt ist
> (Scrollnachrichten landen im Fenster, das den Mausfocus hat, und nicht
> in dem Fenster, über dem sich der Mauszeiger befindet).
das ist geschmacksache, kann es zwar nachvollziehen, aber gestört hatte 
es mich noch nie.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> hier 32bit - aber SP1 vom Studio installiert

Vielleicht haben sie's da repariert. Zwar nutze ich das SP1 jetzt auch, 
aber auf das reparierte Scrollen will ich nicht verzichten.

von Vlad T. (vlad_tepesch)


Lesenswert?

Peter II schrieb:
> das doch mal bitte was ihr von dem Standard so dringend braucht, ich
> hatte zumindest noch nichts vermisst.

was ich immer extrem vermisse sind benamte Initializer für struct-member 
keine Ahnung wie das offiziell heißt, aber ich mein das:
1
struct A
2
{
3
  int i;
4
  int j;
5
};
6
7
8
9
A  a = { .i=1,  
10
         .j=2
11
       };

Diese Initialiserungen sind unter C90 eine beachtliche Fehlerquelle.

von Jean G. (chivas)


Lesenswert?

lanai schrieb:
> Peter II schrieb:
>> Rufus Τ. Firefly schrieb:
>>> Versuch mal was mit dem Scrollrad anzufangen.
>> es ging um den c99 standard - nicht um das VS
> Nö, hier existieren, wie in fast jedem Thread, mehrere Diskussionen
> parallel vor sich hin.

Wie lanai schon andeutete: Der TO stieg nach zwei Posts aus.
Warum macht ihr für solche wiederkehrenden Themen nicht einen separaten 
Thread auf? Der könnte sogar fixiert werden. Bedarf ist scheinbar 
vorhanden, wenn die Moderation hier schon hijacked.

von Mark B. (markbrandis)


Lesenswert?

Jean G. schrieb:
> Wie lanai schon andeutete: Der TO stieg nach zwei Posts aus.
> Warum macht ihr für solche wiederkehrenden Themen nicht einen separaten
> Thread auf? Der könnte sogar fixiert werden. Bedarf ist scheinbar
> vorhanden, wenn die Moderation hier schon hijacked.

Oder man könnte die Diskussion in einen eigenen Thread abspalten. Ich 
weiß aber nicht wie gut oder ob überhaupt die Foren-Software das 
unterstützt. Falls man mühsam von Hand jeden einzelnen Post verschieben 
müsste, dann könnte ich gut verstehen dass das keiner freiwillig machen 
will, würde mir genau so gehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.