Frage

Wie bekomme ich einen C++ - Anwendung, einschließlich einer geladenen ada shared library generieren Kern dump beim Absturz?

Ich habe eine C++ - Anwendung, die lädt die ada gemeinsam genutzte Bibliothek, innerhalb der ada-code bekomme ich einen stack-überlauf-Fehler, die bewirkt, dass das Programm die Kündigung zusammen mit der Ausgabe der Konsole:

raised STORAGE ERROR

Keine core-dump-Datei generiert, auch du, die ich ausgegeben habe eine "ulimit -c unlimited", bevor Sie mit der Anwendung beginnen.

Das gleiche passiert, wenn ich senden Sie eine töten SIGSEGV auf die Anwendung.

Senden töten SIGSEGV zu einer anderen Anwendung, die nicht die ada-dll erzeugt einen core-dump-Datei genau so, wie ich es wollte.

Gefunden hier einige Hinweise: http://objectmix.com/ada/301203-gnat-fstack-check-does-work.html

AKTUALISIERT!Wie bereits erwähnt, indem Sie Adrien, es ist kein Widerspruch, -s stellt die stack-limit, während -c legt die core-Datei beschränken.

Trotzdem bleibt das problem.Ich habe die flags beim Bau des ada-Bibliothek und die fstack-check flag wurde nicht gesetzt, es sollte also generate a core dump.

Althou ich habe nicht versucht es noch, es scheint etwas seltsam.Es erwähnt den -fstack-check compiler-option + die Einstellung der GNAT_STACK_LIMIT variable, aber zur gleichen Zeit bezieht sich auf den ulimit-Befehl das scheint wie ein Widerspruch, festlegen von "ulimit -c" ist die einzige Möglichkeit, die ich kenne, immer eine core-dump generiert werden, die zum Zeitpunkt des Absturzes, wenn dies lässt sich mit der fstack-check option, dann haben wir ein catch-22.

War es hilfreich?

Lösung

Jetzt, fast 2 Jahre später (immer noch arbeiten in der gleichen Firma Kristofer Tat, als er die Frage gestellt hat), wurde die Frage aufgeworfen, wieder - und schließlich denke ich, dass ich weiß, warum keine core-dump generiert wird!!

Das problem ist, verursacht durch die Ada-Laufzeit, die standardmäßig implementiert einen signal-handler für einige POSIX-Signale (für Linux:SIGABRT, SIGFPE, SIGILL, SIGSEGV und SIGBUS).Für GNAT/linux signal-handler aufgerufen wird __gnat_error_handler in a-init.c, die wie folgt aussieht:

static void
__gnat_error_handler (int sig)
{
  struct Exception_Data *exception;
  char *msg;
  static int recurse = 0;
  ...
  switch (sig)
    {
    case SIGSEGV:

      if (recurse)
      {
        exception = &constraint_error;
        msg = "SIGSEGV";
      }
      else
      {
        ...
        msg = "stack overflow (or erroneous memory access)";
        exception = &storage_error;
      }
      break;
     }
    recurse = 0;
    Raise_From_Signal_Handler (exception, msg);
 }

Dieser handler-Prozess "wide", und wird aufgerufen, durch irgendwelche auslöste signal, egal von welchem Teil des Prozesses, es stammt aus (egal ob verschlüsselt an Ada/C/C++,...).

Wenn Sie aufgerufen werden, der Hundeführer steigt eine Ada-Ausnahme und lässt es an der Ada-runtime finden Sie eine passende exception-handler - wenn keine solche handler gefunden wird (zB.wenn ein SIGSEGV generiert wird, die von jedem Teil der C++-code), das Ada-runtime fällt zurück, um genau den Prozess zu beenden, und lassen Sie einfach einen einfachen Ausdruck von __gnat_error_handler (zB."stack overflow (oder fehlerhafte Speicherzugriff)").

http://www2.adacore.com/gap-static/GNAT_Book/html/node25.htm

Um zu verhindern, dass Ada-runtime von der Handhabung ein POSIX-signal und konvertieren es in ein Ada-Ausnahme, es ist möglich, deaktivieren Sie das standardmäßige Verhalten implementiert werden muss, indem mithilfe von

pragma Interrupt_State (Name => Wert, State => SYSTEM | RUNTIME | USER);,

zB.deaktivieren Umgang mit SIGSEGV definieren

Pragma Interrupt_State(SIGSEGV, SYSTEM);

in Ihrem Ada-code - jetzt ist das system das Standard-Verhalten auslöste, wenn ein SIGSEGV angehoben wird, und ein core-dump wird erzeugt, die ermöglicht Sie zu aufzuspüren, den Ursprung des Problems!

Ich denke, das ist ein ganz wichtiges Thema bewusst zu sein, beim mischen von Ada und C/C++ auf *NIX-Plattformen, da es möglicherweise täuschen Sie zu denken, dass Probleme, die Ursprünge aus dem Ada-code(da der Ausdruck gibt eine Ausnahme generiert, die aus Ada), wenn die wirkliche Ursache des Problems liegt in der C/C++-code...

Obwohl es wahrscheinlich sicher ist zu deaktivieren die Ada-runtime Standardbehandlung SIGSEGV (ich glaube, kein vernünftiger Programmierer mit diesem in einer "expected" error handling...Gut, vielleicht in der Luftfahrt verwendet wird die software oder ähnlich, wenn eine Art von "last resort" Funktion, muss aufrechterhalten werden, um zu vermeiden, etwas wirklich schlimmes passiert..) ich glaube, ein bisschen Vorsicht sollte genommen werden, dann "überschreiben" die Ada-runtime-handling für die Signale.

Ein Problem kann sein, das SIGFPE-signal, das wirft auch ein Ada Constraint_Error-Ausnahme vom Standard.Diese Art von Ausnahme kann verwendet werden durch die Ada-code als "excpected Verhalten".Deaktivieren SIGFPE von Pragma Interrupt_State kann ernsthaft beeinträchtigen die Ausführung der Ada-code, und stürzt Ihre Anwendung während der "normalen Umständen" - auf der anderen Seite wird jede division durch null in C/C++-code trig die Ada-exception-handling-Mechanismus, und lassen Sie ohne eine wirkliche Spur von der Herkunft des Problems...

Andere Tipps

Das sieht für mich wie ein wirklich gute Verwendung für Ihre AdaCore Unterstützung. Sie sind nicht verpflichtet, eine ganze Menge von Volk außerhalb der Firma zu finden, die sich mit den Auswirkungen der Wechselwirkungen zwischen Gnu Ada Laufzeit und C ++ ist.

Ich würde vorschlagen, den Ada-Code für das Debuggen, dass Sie in einem allerletzten Exception-Handler um alles versuchen setzen, was wiederum die Ausnahme-Stack-Dumps. Die meisten Anbieter eine Möglichkeit haben, dies zu tun, in der Regel aus der Basis Ada.Exceptions.Exception_Information und Ada.Exceptions.Exception_Message.

Ich fand eine Diskussion aus Sicht der Sicherheit (die Suche nach Malware). Grundsätzlich gibt es 10 Signale, dass Sie versuchen können, SIGSEGV ist nur einer von ihnen.

Es scheint, dass Sie einfach sigaction(SIGSEGV, 0, SIG_DFL); nennen können das Standard-Signalverhalten wiederherzustellen.

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