One search query that has been gaining traction among enterprise Delphi developers is . At first glance, it looks like a fragmented stack trace element or a mis-typed compiler directive. But for those in the know, it represents a specific intersection of MadExcept, runtime packages (BPLs), and application performance/priority settings.
madexcept.bpl;vcl.bpl;rtl.bpl;mybusiness.bpl Now MadExcept initializes first, giving it top-level control. A less common but real issue: when an exception occurs, MadExcept shows a modal dialog. If your application has top-most windows (forms with FormStyle := fsStayOnTop ), the MadExcept dialog might get hidden behind them. Searching for madexceptbpl top sometimes leads to posts about "Make MadExcept dialog top-most too." madexceptbpl top
Introduction In the world of Delphi and C++ Builder development, few tools have earned as much respect as MadExcept – the premier exception handling and leak detection framework created by Mathias Rauen. However, as with any powerful tool that hooks deep into the runtime environment, developers occasionally encounter cryptic errors, configuration dilemmas, or build system quirks. One search query that has been gaining traction
[0040A1F8] madExcept.ThreadExceptFrame (Line ???) [007B3C22] MyPackage.bpl SomeFunction (Line 145) [madexceptbpl] top Here, top might be an artifact of MadExcept’s internal interface – a function named TopOfStack or TopExceptionHandler . If you see madexceptbpl top as the final entry, it means MadExcept has taken control and the original stack unwinding failed to go higher. This is when an exception is raised inside a BPL that MadExcept monitors. Scenario B: BPL Loading Order and "Top" Priority Another interpretation relates to application startup – specifically, ensuring MadExcept’s package loads at the top (i.e., first) among all BPLs. If MadExcept is not at the top of the dependency chain, it may fail to intercept exceptions from other packages. madexcept
Plugin1.bpl was compiled with MadExcept enabled (embedding its own copy). The main EXE also had MadExcept. The two copies conflicted, and the stack trace was overwritten.
| | Why it helps | |--------------|------------------| | Only enable MadExcept in the main EXE | Prevents duplicate hooks and confusing cross-BPL stack traces. | | Use map files for each BPL | Add every BPL’s map file in MadExcept settings → "Append map file". This replaces generic [madexceptbpl] entries with precise unit names. | | Set MadExcept BPL as first in runtime packages | Guarantees top-level exception interception. | | Disable "HandleExceptions" in BPLs | In BPL projects, set MadExcept.HandleExceptions := False so all exceptions propagate to the main EXE’s MadExcept. | | Regularly update MadExcept | Newer versions (5.x, 6.x) handle BPL chains and top-most windows better. | Part 6: Real-World Example – Fixing a “BPL Top Error” Symptom: A developer posts on a forum: “My Delphi app crashes after loading Plugin1.bpl. MadExcept shows only ‘madexceptbpl top’ in the call stack, no line numbers.”
Inside madExcept.pas , there is a function called TopOfStack (or GetTopOfStack ), which returns the highest memory address of the current thread’s stack. When an exception occurs in a BPL, MadExcept sometimes logs the instruction before the crash as: