000
09.06.2005, 14:23 Uhr
Arta
|
Hallo,
ich habe folgendes Problem: Ich möchte mit Hilfe von Signalhandlern verschiedene Signale abfangen, um dann spezifisch darauf zu reagieren. Unter diesen Signalen befinden sich auch die Signale SIGSEGV und SIGBUS, also Signale, die potentiell durch einen Stackoverflow versursacht wurden. Mein Ziel ist es nun, im Signalhandler abzufragen, ob die Ursache der Signale eben solch ein Stackoverflow war(dann will ich den ganzen Prozess beenden) oder ob dies einen anderen Grund hat (vielleicht hat ja irgendwer von irgendwo einfach einen SIGSEGV an den Prozess geschickt oder es hat einen anderen grund etc.), damit ich dann möglicherweise im Programm an einer definierten Stelle weitermachen kann. Das ganze möchte ich sowohl unter Solaris auf einem Sparc, als auch unter Linux auf einem Intel zum laufen kriegen. Auf Solaris ist das auch gut möglich gewesen: 1. aus dem ucontext den ss_sp-Zeiger auslesen: Der Zeigt auf die niedrigstmögliche Stackadresse 2. aus dem ucontext das Register ESP auslesen: Der Stackpointer Nun kann man einfach abfragen ob die Stackpointeradresse unter der Adresse des ss_sp-Zeigers liegt und wenn ja, dann hat man einen Stackoverflow erkannt.
Unter Linux auf einem Intel ergeben sich nun für mich aber sehr seltsame ergebnisse: - Der Stackoverflow wird nach wie vor korrekt gemeldet (bei Standarteinstellungen, sobald der ESP-Zeiger die ersten 8MB hinter sich gelassen hat...) - Der SS_SP-Zeiger zeigt eifnach immer irgendwo hin, aber nicht an eine feste Stelle, die den niedrigst mögliche Stackadresse darstellt. - Die Stacksize, die ich mir über den ucontext (oder auch über pthread) besorge, wird immer mit 1 GB, anstatt mit 8MB angezeigt, wobei 8MB bei mir aber der korrekte Wert ist.
Hat vielleicht jemand eine Ahnung, oder einen weiteren Tipp wie ich mir unter C++ auf Linux/Intel die korrekte Stackgrösse etc. holen kann, oder warum die Stacksize immer mit 1GB angegeben wird und der SS_SP-Zeiger vom ucontext keinen festen Wert hat?
Gruss Arta |