2009-02-26 8 views
3

Ich betrachte einen Kern aus einem Prozess, der unter Unix läuft. Normalerweise kann ich mich in der Umgebung bewegen und in das Backtrace einsteigen, um ein Speicherproblem zu identifizieren. In diesem Fall bin ich mir nicht sicher, wie es weitergeht.Segmentierungsfehler unter Unix - mögliche Stapelkorruption

Erstens gibt das Backtrace nur 3 Frames, wo ich viel mehr erwarten würde. Für diese Rahmen erscheinen alle dargestellten Funktionsparameter vollständig ungültig. Es gibt nicht das, was ich erwarten würde.

Einige Zeiger Parameter haben folgende mit ihnen verbunden sind - nicht-Speicher an der Adresse zugreifen kann

Wäre dies eine Art von kompletten Stapel Korruption vor. Ich habe den Prozess mit libumem ausgeführt und alle Puffer wurden als sauber gemeldet.

umem_status hat auch nichts gemeldet.

so grundsätzlich bin ich ratlos. Was sind die wahrscheinlichen Ursachen? Worauf sollte ich im Code achten, da libumem offenbar keine Fehler gemeldet hat.

Irgendwelche Vorschläge, wie ich weiter debuggen kann? irgendwelche zusätzlichen Funktionen in MDB sollte ich in Betracht ziehen?

danke.

+0

Können Sie den letzten bekannten guten Punkt im Stapel finden (über manuelles Tracing)? Klingt wie ein Pufferüberlauf. –

+0

ist C++ durch Zufall beteiligt? klingt wie ein statisches Initialisierungsproblem. –

+0

wäre hilfreich, wenn Sie diese 3 Frames eingefügt haben, damit wir sehen können, was das sind, denke ich –

Antwort

4

Stack Korruption klingt wie eine Möglichkeit. Einige Dinge zu versuchen:

  • Schalten Sie alle Compiler-Warnungen, die Sie können!
  • Flusen laufen lassen!
  • Wenn möglich, versuchen Sie Gebäude & Testen Sie Ihr Programm auf OpenBSD, die eine Menge von Speicher Korruption Erkennung eingebaut hat.
  • Verwenden Sie nach Möglichkeit einige Tools wie ProPolice, StackGuard, et al.
  • Wenn Sie dieses Problem problemlos reproduzieren können, lohnt es sich, im Debugger herumzuspielen. Beschränke es so weit wie möglich und gehe dann durch.
0

sollte nicht libumem die gleiche Überschreitung als Elektrozaun melden?

können in der Testumgebung nicht einfach reproduzieren, sondern in kommerziellen env unter Unix/der Kern solaris tritt aber libumem zeigt nichts Schlechtes,

0

Ihr Code? Wenn mir das passiert, finde ich immer dasselbe: Ein Nullzeiger. Sieht schrecklich aus, wenn es abstürzt, aber die Ursache ist letztlich einfach.

0

Ich stieß auf ähnliches Problem. Das Backtrace von GDB war nicht hilfreich. Valgrind kam zu meiner Rettung.

Führen Sie Ihre Anwendung über Valgrind. Identifizieren Sie alle Fehler wie ungültige Schreibvorgänge. Analysieren Sie den Code und prüfen Sie, ob sie behoben werden können.

In meinem Fall versuchte ich einen ungültigen Schreibvorgang (der manchmal NULL schreiben könnte), der seine Wirkung nicht in diesem Fall zeigte, sondern sonst wo.