Skip to content

Some cost centre stacks are not registered via registerCcsList()

In #15508 (closed) I observe that some closures have incorrect CCS field. To be able to catch this problem as early as possible I implemented a simple check:

static void
checkClosureProfSanity(const StgClosure *p)
{
    StgProfHeader prof_hdr = p->header.prof;
    CostCentreStack *ccs = prof_hdr.ccs;

    // For now just make sure the CCS is a registered CCS and not a pointer to
    // some random heap closure (happened before, see #15508).
    for (CostCentreStack *ccs_ = CCS_LIST; ccs_; ccs_ = ccs_->prevStack) {
        if (ccs == ccs_) {
            return;
        }
    }

    barf("CCS for closure %p is not registered: %p", (void*)p, (void*)ccs);
}

I call this on all closures before and after a GC. This assumes that all cost centre stacks are registered via registerCcsList(), however this currently does not hold. I was able to find two cases:

  • base_GHCziIOziHandleziFD_CAFs_cc_ccs is never registered (there are probably

a few CCSs per module like this which are never registered)

  • None of the dynamically allocated CCSs are registered.

My question is: am I misunderstanding how the CCS registry (CCS_LIST) is supposed to be used? I thought all CCSs should really be in that list, because the list is used when reporting. Not registering a CCS means not reporting it.

Trac metadata
Trac field Value
Version 8.6.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Profiling
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information