Bigbridge brengt nieuwe debugging tool uit: livestack.py

Jelle Besseling

16/1/2026

4 min. lezen

Waarom debuggen op productie zo lastig is

Hardnekkige bugs op productie zijn vaak het lastigst te achterhalen. Tools als Xdebug werken fantastisch op je eigen computer of op staging, maar kun je op productie niet gebruiken. Simpelweg omdat het processen zwaar vertraagt.

Bij Bigbridge liepen we tegen precies dat probleem aan bij een klant met extreem langlopende index-processen. We hadden meer nodig: live kunnen zien waar een PHP-proces mee bezig is. Zonder impact op de performance natuurlijk.

Dat leidde tot livestack.py: een lichte open-source tool waarmee developers real-time een stacktrace kunnen opvragen van draaiende PHP-processen op productie.

Benieuwd naar het volledige technische verhaal achter de tool? Jelle, developer bij Bigbridge, neemt je hieronder mee in de ontdekkingstocht die tot livestack.py heeft geleid.

Een hardnekkig Magento performance­­probleem

Bij veel bugs is het zo dat je ze pas goed kan begrijpen als je stap voor stap door de code loopt en kijkt wat de ruwe data je vertelt. Op je eigen computer en op staging kan je dit doen met Xdebug, en dat werkt erg goed. Maar wat als je een hardnekkige bug hebt op productie? Daar draai je normaal geen Xdebug omdat het alle PHP code langzamer laat draaien.

Zo hadden wij een keer last van onmogelijk groot MySQL memory gebruik. We zagen een grote Magento productieserver steeds meer RAM gebruiken totdat de hele server vol zat, en er een restart nodig was. Alle RAM werd gebruikt door MySQL, maar veel meer dan de ingestelde InnoDB buffer pool size.

Debuggen op een lager niveau met GDB

Waar we al wel achter waren was dat er altijd een indexer heel lang bleef lopen, en dat dit mogelijk te maken had met het memorygebruik op de MySQL server. Het probleem was dat we nog niet wisten welke indexer, en waar in de code dit misging. Toen had ik het idee om het debuggen op een lager niveau te doen, en GDB (de GNU debugger) aan te sluiten op het PHP proces. Dit bleek een stuk lastiger te zijn dan gedacht, aangezien je in de debugger alleen de ruwe assembly kon zien, en niet de datastructuren en code uit de originele C bronnen van PHP. Hypernode kon hier de oplossing in bieden, zij hebben toen speciaal voor ons de php-dbg package geïnstalleerd waarin de debug symbols te vinden zijn voor GDB.

Met de debug symbols ingeladen in GDB was het nog steeds niet super eenvoudig om te zien waar het PHP mee bezig was. Ik heb nog best wel lang de PHP C code zitten doorlezen om te kijken hoe de internals werken, en op welke plekken te vinden is wat bijvoorbeeld het huidige PHP bestand is wat wordt uitgevoerd. De doorslag was uiteindelijk een aantal globals, die via de debugger dus ook altijd uit te lezen zijn, waarin deze informatie wordt bijgehouden. Voor de geïnteresseerden, de belangrijke struct van het hele verhaal is de executor_globals.

De current_execute_data in die struct geeft alle data die we nodig hadden. Door het lang durende proces een aantal keer in GDB te pauzeren en te kijken naar de data in die structs konden we er achter komen in welke bestanden en functies het proces zo veel tijd kwijt was. Omdat het ging om een loop die oneindig lang door leek te gaan (eigenlijk was het niet oneindig maar gewoon heel veel data), kwamen we telkens dezelfde paar functies tegen. Ook konden we precies zien welke MySQL queries werden uitgevoerd.

Van handmatig debuggen naar een simpele tool

Voor ons was dit een geslaagde debugsessie, want we hebben hiermee het probleem kunnen oplossen voor onze klant. Maar zelf het proces pauzeren met GDB en dan alles uitpluizen is wel veel werk. Daarnaast wil je ook niet altijd het proces zo lang pauzeren, het liefst wil je dat het meteen weer door kan draaien. En om ook mijn collega's en andere developers de mogelijkheid te geven om op deze manier te debuggen, heb ik livestack.py ontwikkeld. De commando’s die je normaal handmatig in GDB zou uitvoeren kan livestack.py eenvoudig voor jou aanroepen, en zo heb je live direct een stack trace te zien van een draaiend PHP proces.

livestack.py werkt op PHP-fpm en PHP CLI processen. Bij standaard gebruik van de tool krijg je zo’n soort stacktrace te zien:

In de stacktrace kan je direct zien dat curl_exec wordt aangeroepen, en ook vanuit waar. Als je datzelfde commando nu een aantal keer achter elkaar aanroept, zie je meteen of de code hier blijft hangen of niet. Dit soort informatie kan je ook achteraf zien in profiling tools, maar met livestack.py kan je het live zien!

Een moeilijke debugsessie heeft dus geleid tot een unieke debugtool waarmee je live kan bekijken wat je PHP proces aan het doen is. Ik denk dat livestack.py als simpele tool wel veel kan toevoegen, aangezien debuggen op production niet kan met Xdebug. Je kan dit nu uitproberen op Hypernode servers, hiervoor moet je Hypernode support vragen om ook de PHP debug symbols te installeren. Voor meer informatie kijk dan op de Hypernode docs site: https://docs.hypernode.com/hypernode-platform/tools/how-to-debug-long-running-php-processes-with-livestack.html

livestack.py is ook open source beschikbaar onder de MIT licentie. De code kan je vinden op GitHub: https://github.com/bigbridge-nl/livestack

Hebben wij jouw
interesse gewekt?

Laten we er eens over kletsen, onder het genot van een goede kop koffie!

neem contact op