2016-07-12 6 views
3

In einem Posix-System kodiere ich einen Signal-Handler mit sigaction.Wie kann ich mehr Stapel in den Todesfällen meines Programms zuweisen?

Ich möchte einige Debuginformationen aufzeichnen, bevor Sie exit() aufrufen. Dies beinhaltet einige Prozeduraufrufe.

Wenn wir einen Stack-Überlauf hatten, gibt es irgendeine Möglichkeit, dass ich diese Funktionsaufrufe machen kann, ohne die Dinge weiter zu vermasseln?

Ich weiß, dass, nachdem ich meine Debug-Sachen mache, ich exit() anrufen werde, also werden wir den Stapel nie abwickeln. Könnte ich einen kleinen Assembler einfügen, um den Stapelzeiger auf die Basis des Stapels zu setzen?

Egal, dass ich es wegschmeiße; es wird später nicht gebraucht werden, und indem ich den Anfang des Stapels wegschmeiße, werde ich nicht über das Ende hinausstürzen.

Hat jemand dies getan, oder eine Alternative, und zeigte es zu arbeiten?

+4

Wenn Sie dies innerhalb eines Signal-Handlers tun möchten, warum richten Sie nicht einfach einen 'sigaltstack' ein, so dass das Limit auf dem Haupt-Stack keine Rolle spielt? – EOF

+0

Weil ich es nicht ahnte (schüchternes Grinsen). Fühlen Sie sich frei, dies als Antwort zu posten. Detail wäre nett, aber ich kann Google dafür, jetzt, da du mir einen Hinweis gegeben hast. – Mawg

Antwort

4

In POSIX können Sie mit sigaltstack() einen separaten Stapel für bestimmte Signalhandler einrichten. Die manpage auf Linux für diese Funktion ist sehr schön:

Die häufigste Verwendung eines alternativen Signalstapel ist das SIGSEGV Signal zu behandeln, wenn der verfügbare Platz für den normalen Prozess Stapel erzeugt wird, aufgebraucht ist: In diesem Fall kann ein Signalhandler für SIGSEGV nicht auf dem Prozessstapel aufgerufen werden; Wenn wir damit umgehen wollen, müssen wir einen alternierenden Signalstack verwenden.

Eine Sache im Auge zu behalten ist, dass Sie sigaction() verwenden müssen, anstatt signal() die entsprechenden Signal-Handler zu etablieren, aber das ist eine gute Idee trotzdem. Auch die sa_flags für sigaction() s struct sigaction müssen SA_ONSTACK enthalten.

+0

Klingt gut! Diese verwandte Frage gibt ein Codebeispiel http://stackoverflow.com/questions/5785746/how-to-use-sigaltstack-in-signal-handler-program – Mawg

1

Es ist nicht erforderlich, dass Ihr Programm den Stapel (für Callframes, im Gegensatz zur Datenstruktur) verwendet. Seine eine Turing-complete-Programmiersprache können Sie jede funktionell rekursive Schleife neu schreiben (zB Schleife Funktionsaufruf unter Verwendung) als prozedural rekursive Schleife (zB Verfahrensschleifen wie for, while und do .. while) Bereitstellen man die entsprechende Sprache einzuführen und Datenstrukturen.

Sie könnten dann eine Stapel (Datenstruktur, nicht das gleiche wie die callframe) bis zu mehreren Gigabyte finden wachsen, ist für die meisten Laptops trivial realloc ... Als zusätzliche Bonus verwenden, werden Sie nicht mehr beschäftigen müssen in nicht-portable Hacks, wie zum Beispiel implementierte Assembler-Notationen oder Signale.

Verwandte Themen