Frage

Bitte um Hilfe! Ich bin wirklich mit meinem Latein am Ende. Mein Programm ist ein wenig persönliche Notizen-Manager (google für „cintanotes“). Auf einigen Computern (und natürlich auch ich besitze keine von ihnen) stürzt mit einer nicht behandelten Ausnahme kurz nach dem Start. Nichts Besonderes an diesen Computern gesagt werden könnte, mit der Ausnahme, dass sie dazu neigen, AMD CPUs zu haben.

. Umgebung: Windows XP, Visual C ++ 2005/2008, roh WinApi

Hier ist, was über diese "Heisenbug" Sicher ist:

1) Der Absturz passiert nur in der Release-Version.

2) Der Absturz geht weg, sobald ich alle GDI-bezogenes entfernen.

3) BoundChecker hat keine Beschwerden.

4) ein Protokoll Schreiben zeigt, dass der Absturz auf eine Erklärung eines lokalen int-Variable passiert! Wie kann das sein? Speicherfehler?

würde Irgendwelche Ideen sehr geschätzt!

UPDATE: Ich habe es geschafft, die App auf einem "fehlerhaften" PC debug zu bekommen. Die Ergebnisse:

"Nicht behandelte Ausnahme bei 0x0044a26a in CintaNotes.exe: 0xC000001D. Illegal Instruction"

und Code bricht auf

0044A26A cvtsi2sd XMM1, dword ptr [esp + 14h]

So scheint es, dass das Problem in der war "Code-Generierung / Aktivieren erweiterter Befehlssatz" Compiler-Option. Es wurde auf „/ arch: SSE2“ gesetzt und wurde auf den Maschinen abstürzt, die nicht SSE2 unterstützt hat. Ich habe diese Option auf „Nicht festgelegt“ und der Fehler ist weg. Puh!

Vielen Dank sehr viel für die Hilfe !!

War es hilfreich?

Lösung

So ist es Absturz doesnnt wenn Konfiguration ist DEBUG Konfiguration? Es gibt viele Dinge anders als ein RELEASE configruation: 1.) Initialisierung der globalen Variablen 2.) Die tatsächliche Maschinencode erzeugt etc ..

So erster Schritt ist, herauszufinden, welche genauen Einstellungen für jeden Parameter in dem RELEASE-Modus sind in Bezug auf den DEBUG-Modus verglichen.

-AD

Andere Tipps

  

4) Writig ein Protokoll zeigt, dass der Absturz auf eine Erklärung eines lokalen int-Variable passieren! wie kann das sein? Speicherfehler?

Was ist der zugrunde liegende Code in der ausführbaren Datei / Montag? Erklärung int ist kein Code überhaupt, und als solche kann nicht zum Absturz bringen. Haben Sie die int irgendwie initialisieren?

Um den Code zu sehen, wo der Absturz passiert, sollten Sie durchführen, was eine postmortale Analyse genannt wird.

Windows-Fehlerberichterstattung

Wenn Sie den Absturz analysieren mögen, sollten Sie eine Crash-Dump erhalten. Eine Möglichkeit hierfür ist für Windows-Fehlerberichterstattung registrieren - erfordert etwas Geld (Sie benötigen eine digitale Code-Signing-ID) und eine Form-Füllung. Für weitere Informationen besuchen https://winqual.microsoft.com/ .

Get-Dump des Absturzes, die für WER direkt vom Kunden

Eine weitere Möglichkeit ist in Kontakt Hexe einige Benutzer zu erhalten, die den Absturz erlebt und einen Crash-Dump, die für WER direkt von ihm zu bekommen. Der Benutzer kann dies tun, wenn er sich an den technischen Details klickt vor dem Absturz an Microsoft senden -. Die Crash-Dump-Speicherort der Datei kann es zu prüfen

Ihre eigene minidump

Eine andere Möglichkeit ist, Ihre eigene Exception-Handler, behandeln die Ausnahme registrieren und eine minidump schreiben überall Sie wollen. Ausführliche Beschreibung finden Sie unter Code Project Post-Mortem Debugging der Anwendung mit Minidumps und Visual Studio gefunden werden. NET Artikel .

  

1) Der Absturz passiert nur in der Release-Version.

Das ist in der Regel ein Zeichen dafür, dass Sie auf einige Verhalten angewiesen sind, die nicht garantiert ist, sondern geschieht in der Debug-Build um wahr zu sein. Zum Beispiel vergessen, wenn Sie Ihre Variablen zu initialisieren, oder ein Array Zugriff außerhalb der Grenzen. Stellen Sie sicher, dass Sie auf alle Compiler überprüft aktiviert haben (/ RTCsuc). Auch Dinge überprüfen, wie auf der Reihenfolge der Auswertung der Funktionsparameter zu verlassen (die nicht garantiert ist).

  

2) Der Absturz geht weg, sobald ich alle GDI-bezogenes entfernen.

Vielleicht ist das ein Hinweis, dass Sie etwas falsch mit dem GDI-bezogenes tun? Sind Sie mit Hilfe von Zieh nachdem sie schon befreit worden ist, zum Beispiel?

Laden Sie sich die Debugging-Tools für Windows Paket. Stellen Sie die Symbolpfade korrekt, dann führen Sie Ihre Anwendung unter WinDbg. An einem gewissen Punkt wird es mit einer Zugriffsverletzung brechen. Dann sollten Sie den Befehl ausführen „! Analyze -v“, was ziemlich intelligent ist und sollten Sie auf einen Hinweis geben, was falsch gehen.

Die meisten heisenbugs / release nur Fehler sind entweder aufgrund Ablauf der Steuerung, die von uninitialised Speichern / abgestanden Zeigern / Vergangenheit Ende des Puffers ist abhängig von liest, oder Rennbedingungen oder beides.

Versuchen Sie Verteilern überschrieben, so dass sie Speicher Null aus bei der Zuteilung. Tritt das Problem weggehen (oder wird mehr reproduzierbar?)

  

Writig ein Protokoll zeigt, dass der Absturz auf eine Erklärung eines lokalen int-Variable passiert! Wie kann das sein? Speicherfehler?

Stack-Überlauf! ;)

  

4) Writig ein Protokoll zeigt, dass der Absturz passiert auf einer Deklaration einer lokalen int-Variable! Wie das sein könnte? Speicherfehler

Ich habe die Ursache für zahlreiche „seltsame Abstürze“ gefunden in einer Elementfunktion des Objekts dereferencing eine gebrochenen this werden.

Was sagt der Absturz? Zugriffsverletzung ? Ausnahme? Das wäre der weitere Hinweis dies mit

zu lösen

Stellen Sie sicher, Sie keine vorhergehenden Speicherverfälschungen mit Pageheap.exe haben

Stellen Sie sicher, haben Sie keinen Stack-Überlauf (CBIG array [1000000]) haben

Stellen Sie sicher, dass Sie keine nicht initialisierten Speicher.

Weitere können Sie die Release-Version auch innerhalb des Debugger ausführen, wenn Sie Debug-Symbole (nicht das gleiche wie das Erstellen Debug-Version) für den Prozess erzeugen. Schritt durch und sehen Sie, wenn Sie irgendwelche Warnungen im Debugger Trace-Fenster bekommen.

„4) Schreiben ein Protokoll zeigt, dass der Absturz auf einer Erklärung einer lokalen int-Variable passiert! Wie kann das sein? Speicherbeschädigung?“

Dies könnte ein Zeichen dafür sein, dass die Hardware in der Tat ist defekt oder zu hart geschoben. Finden Sie heraus, wenn sie ihre Computer übertaktet haben.

Wenn ich diese Art der Sache zu bekommen, versuche ich laufe den Code durch gimpels PC-Lint (statische Code-Analyse), da es verschiedene Klassen von Fehlern zu Boundsprüft. Wenn Sie Bounds verwenden, schalten Sie die Speichervergiftung Optionen.

Sie erwähnen AMD CPUs. Haben Sie untersucht, ob es eine ähnliche Grafikkarte / Treiberversion ist und / oder Konfiguration an den Maschinen an Ort und Stelle, die zum Absturz? Ist es zum Absturz immer auf diesen Maschinen oder nur gelegentlich? Vielleicht auf diesen Maschinen das Systeminformationstool laufen und sehen, was sie gemeinsam haben,

Klingt wie Stapelbeschädigung zu mir. Mein Lieblingswerkzeug diejenigen aufzuspüren, ist IDA Pro . Natürlich müssen Sie nicht, dass der Zugriff auf den Computer des Benutzers.

Einige Speicher Kontrolleure hat eine harte Zeit zu kontrollieren Stapelbeschädigung (wenn es in der Tat, dass). Der sicherste Weg, um diejenigen ich denke, ist eine Laufzeitanalyse zu erhalten.

Dies kann auch aufgrund von Korruption in einer Ausnahme Weg sein, auch wenn die Ausnahme behandelt wurde. Haben Sie debuggen mit ‚Fang der ersten Chance Ausnahmen‘ eingeschaltet? Sie sollten so lange wie möglich. Es geht ärgerlich nach einer Weile in vielen Fällen.

Können Sie diesen Benutzern eine geprüfte Version Ihrer Anwendung senden? Schauen Sie sich Minidump diese Ausnahme Griff und schreiben a dump. Dann nutzen Sie WinDbg auf Ihrer Seite zu debuggen.

Eine andere Methode ist das Schreiben sehr detaillierte Protokolle. Erstellen Sie ein „Log jede einzelne Aktion“ Option, und bitten Sie den Benutzer, dass auf drehen und es zu schicken. Auskippen Speicher zu den Protokollen. Check out '_CrtDbgReport ()' auf MSDN.

Good Luck!

EDIT:

Die Antwort auf Ihren Kommentar: Ein Fehler auf einer lokalen Variablendeklaration ist mir nicht überraschend. Ich habe dies viel gesehen. Es ist in der Regel aufgrund eines beschädigten Stack.

Einige Variablen auf dem Stapel können laufen über sie Grenzen beispielsweise sind. Bricht die Hölle los danach. Dann stapeln Variablendeklarationen zufaelliges Speicherfehler, virtuelle Tabellen beschädigt wird, etc.

Immer wenn ich die für eine verlängerte Zeitdauer gesehen habe, habe ich zu IDA Pro gehen musste. Detaillierte Laufzeit Demontage Debuggen ist das einzige, was ich weiß, dass wirklich diejenigen zuverlässig bekommt.

Viele Entwickler verwenden WinDbg für diese Art von Analyse. Deshalb habe ich auch Minidump vorgeschlagen.

Versuchen Sie Rational (IBM) PurifyPlus. Es fängt eine Menge Fehler, die Bounds nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top