2009-07-27 11 views
3

Ich habe eine VxWorks-Anwendung, die auf ARM uC läuft.Wie ermittelt man, warum eine Aufgabe zerstört, VxWorks?

Lassen Sie mich zuerst die Anwendung zusammenfassen;

Anwendung besteht aus einem 3rd-Party-Stack und einer Gateway-Anwendung. Wir haben eine Betriebssystemabstraktionsschicht implementiert, um Betriebssystemabhängigkeiten zu unterstützen.

Der zugrunde liegende Stack verfügt über eine eigene Speicherverwaltung & Steuerfunktion, die Speicherblöcke in einer doppelt verknüpften Liste enthält.

Zum Beispiel; Wir führen nicht direkt malloc/new, free/delete aus. Stattdessen rufen wir die Routinen der OSA-Ebene auf und holen den Speicher von OS und fügen ihn in eine Liste ein (Routinen: XXAlloc, XXFree, XXReAlloc)

Und wenn wir den Speicher freigeben, verwenden wir wieder XXFree.

In der Tat ist dieser Block eine Struktur, die

magic Zahlen Anzeige der Anfang und das Ende des Speicherblocks hat -Größe, dass Benutzer -Größe in Wirklichkeit zugeordnet Verlangte aufgrund Ausrichtung vorherige und nächste Zeiger Ausgabe - Zeiger auf ein Stück Speicher, der der Anwendung zurückgegeben wird. Link-Register, das anzeigt, wo in der Anwendung xxAlloc aufgerufen wird.

Mit diesem Blockstruktur-Stack kann überprüft werden, ob ein Block beschädigt ist oder nicht.

Auch wir haben pthread-Bibliothek, die von Linux portiert wird, die wir -create verwenden/beenden Threads (derzeit sind es 22 Threads) -synchronization Objekte (Ereignisse, Mutexe ..)

Es ist Hauptaufgabe aufgerufen von taskSpawn und später erstellte diese Aufgabe andere Threads.

Dies war eine Beschreibung der Anwendung und ihrer VxWorks-Schnittstelle.

Das Problem ist:

eine der Aufgaben plötzlich von VxWorks zerstört wird keine Information über das Geben, was falsch ist. Ich habe auch einen Jtag Debugger und es trifft die VxWorks taskDestoy() Routine, aber Call-Stack gibt keine Informationen weder PC oder R14.

Ich bin verdächtige spezifische Routine in Code, wo riesige xxAlloc ist fertig, aber Problem auftritt sehr sporadisch gibt keine Ahnung, dass ich es Quellcode zuordnen kann.

Ich denke, Betriebssystem erkennt und Ausnahme und führt seine Behandlung im Hintergrund.

würde jede mögliche Hilfe

Grüße

+1

Vorschlag, um die Frage ein wenig zu formatieren: Problemstellung am Anfang und Hintergrundinformationen danach. Auf diese Weise müssen die Leser nicht die ganze Geschichte lesen, um herauszufinden, ob sie übereinstimmt. – Adriaan

Antwort

1

Es aufgelöst.

Ich habe einen isolierten Test gemacht. 20MB mit malloc und memset mit 0x55 zugewiesen und Thread meiner Anwendung gestoppt.

Und ich schrieb einen anderen Thread, der meine 20MB überprüft, wenn andere Daten als 0x55 geschrieben werden.

Und quess was !! ein anderer Thread, der zu anderen Komponenten in der CPU gehört (jemand anders hat sie entwickelt), schreibt meinen zugewiesenen Platz.

Dank 4 Ihre Hilfe

+0

Und jetzt können Sie eine Antwort akzeptieren und Ihre Frage aus Unanswered entfernen;) – zxcat

0

groß sein, wenn Ihre Aufgabe beendet wird, taskDestroy() aufgerufen wird. Wenn Sie bei xxAlloc misstrauisch sind, vergewissern Sie sich, dass der Zuordnungscode exit() nicht aufruft, wenn der Speicher erschöpft ist. Ich wurde von diesem Verhalten in einem Drittanbieter-OSAL zuvor gebissen.

+0

Hallo Es gibt keine Ausfahrt() am Code. Thnx – tguclu

+0

Die andere ähnliche Möglichkeit ist, dass der Einstiegspunkt der Aufgabe einfach zurückkehrt. (Oder eine Exit-ähnliche Funktion heißt ... abort()?) Ich habe auch diese Art von Verhalten im Falle von Stack-Korruption oder Stack-Überlauf gesehen. – bstpierre

0

Klingt, als würden Sie nach der Integration debuggen; Das kann ein höllischer Job sein. Ich schlage vor, das Problem in kleinere Stücke zu zerlegen.

Prozess

1) Sie mehr Einblick durch den Code instrumentiert und/oder mit VxWorks Intrumentation bekommen können (je nach Version). Auf diese Weise können Sie besser erkennen, was passiert. Stellen Sie sicher, dass Sie alles in einer Datei protokollieren, sodass Sie von dem Punkt, an dem die Aufgabe endet, zurückgehen. Instrumentierung ist eine lohnende Investition, da sie in mehr Gelegenheiten nützlich sein wird. Interessante Haken in VxWorks: Taskhooklib

2) Speicherzuweisung/Freigabe ist sehr grundlegende Funktionalität. Es wäre mein erster Kandidat für gründliche (Unit-) Tests in einer gut definierten Multithread-Umgebung. Wenn Sie dies getan haben und keine Fehler gefunden werden, würde ich zuerst nachsehen, warum die Tas beendet ist.

andere mögliche Ursachen

Eine Aufgabe wird auch beendet, wenn die Arbeit getan ist .. so kann es eine Rückkehr von einem nicht-so-Endlosschleife verursacht werden. Vor allem, wenn es immer die gleiche Aufgabe ist, wäre das meine Vermutung.

Und einige Versionen von VxWorks haben MMU-Unterstützung, die berücksichtigt werden müssen.