Thread Wie findet man stack usage des aktuellen Perl-Prozesses heraus ?
(17 answers)
Opened by barney at 2024-08-30 18:24 2024-09-03T05:57:34 barney Der Unterschied kommt daher, dass Du mit say etwas auf STDOUT schreibst, aber nichts auf STDERR. Versuche es mal mit einer Kombination von warn und say, bei mir führt das dann zu gleichen Lauflängen. Wenn man das Programm mal in den GDB einspannt, wird es etwas klarer: Das ganze ist eine "deep recursion". Die :encoding-Layer sind tatsächlich Schichten, jeder Aufruf von binmode packt eine neue Schicht drauf. Das verbraucht nicht nur (wenig) Speicher, es wird auch zunehmend langsamer. Der Tod tritt dann beim Abarbeiten der zigtausend Schichten ein, wenn tatsächlich eine Ausgabe stattfindet. Beim Absturz weist mein GDB eine Stack-Tiefe von 104794 aus, je drei pro Layer (PerlIOBuf_write, PerlIOEncode_flush, Perl_PerlIO_flush), und entspricht damit ziemlich genau den 34924 Iterationen, die Du gefunden hast. Dass PerlIO in "Schichten" arbeitet, hat ja schon einen gewissen Sinn, aber ich kann mir keinen Anwendungsfall mit tausend Schichten vorstellen... da könnte Perl schon eine Bremse einbauen. Dabei werden möglicherweise noch ein paar Programme auffliegen, die binmode in der I/O-Schleife aufrufen. |