Segmentierungsfehler bei AWS Lambda
Bei der Nutzung von AWS Lambda in einem Linux-Container und dem mehrmaligen gleichzeitigen Aufrufen der Render-Methode tritt manchmal die folgende Ausnahme auf.
Ausnahme:
Fehler: Laufzeit beendete mit Fehler: Signal: Segmentierungsfehler Laufzeit.Beendigungsfehler
Lösungen
Die Lösung besteht darin, die GC.Collect Methode aufzurufen, nachdem das PDF-Dokument gerendert wurde. Dieses Problem wurde auf Amazon Linux 2023 mit aktuellen IronPDF-Versionen berichtet; frühere Bereitstellungen mit .NET 6 und Amazon Linux 2 sind nicht betroffen.
// Create an instance of ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render the HTML string to a PDF document
PdfDocument document = renderer.RenderHtmlAsPdf(htmlString);
// Explicitly trigger garbage collection to help manage memory usage
GC.Collect();
// Create an instance of ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render the HTML string to a PDF document
PdfDocument document = renderer.RenderHtmlAsPdf(htmlString);
// Explicitly trigger garbage collection to help manage memory usage
GC.Collect();
' Create an instance of ChromePdfRenderer
Dim renderer As New ChromePdfRenderer()
' Render the HTML string to a PDF document
Dim document As PdfDocument = renderer.RenderHtmlAsPdf(htmlString)
' Explicitly trigger garbage collection to help manage memory usage
GC.Collect()
Mehrprozess-Rendering und wstring_convert::from_bytes Fehler
Falls GC.Collect() das Problem nicht löst, könnte die Ursache das Multi-Prozess-Rendering oder die globale ChromePdfRenderer Wiederverwendung innerhalb des Lambda-Containers sein. Dies erzeugt entweder einen Segmentierungsfehler oder eine C++-Ausnahme:
Process runtime-1 exited: signal: segmentation fault
Error while generating PDF from HTML: 'wstring_convert::from_bytes'
Diese Fehler treten sporadisch auf und können erst nach dem ersten oder zweiten Lambda-Container-Aufruf auftreten.
Lösung
Setzen Sie Installation.SingleProcess = true, leiten Sie Pfade zu /tmp um und erstellen Sie ein neues ChromePdfRenderer pro Aufruf:
IronPdf.Installation.SingleProcess = true;
IronPdf.Installation.TempFolderPath = "/tmp";
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(htmlString);
IronPdf.Installation.SingleProcess = true;
IronPdf.Installation.TempFolderPath = "/tmp";
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(htmlString);
Imports IronPdf
IronPdf.Installation.SingleProcess = True
IronPdf.Installation.TempFolderPath = "/tmp"
Dim renderer As New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(htmlString)
Rufen Sie Installation.Initialize() nicht auf und halten Sie kein ChromePdfRenderer als statische oder Feldebenen-Instanz. Ein persistenter Renderer nimmt alten Speicherzustand in nachfolgende Lambda-Aufrufe mit und verursacht den Absturz.
// Avoid: global renderer reuse
private readonly ChromePdfRenderer _renderer = new();
// Avoid: calling Initialize()
Installation.Initialize();
// Avoid: global renderer reuse
private readonly ChromePdfRenderer _renderer = new();
// Avoid: calling Initialize()
Installation.Initialize();

