I proposed to build Phobos and Druntime with stack frames enabled:

https://issues.dlang.org/show_bug.cgi?id=13726

Stack frames add three CPU instructions to each function (two in the prolog, and one in the epilog). This creates a linked list which debuggers, profilers, etc. can easily walk to find which function called which. They would allow debugging certain classes of bugs much more easily (e.g. the recurring InvalidMemoryOperationError - there's a thread about it in D.learn just today), and profiling your code with polling (non-instrumenting) profilers.

As I understood, in theory, debug information (DWARF and PDB, probably not CV) should also contain information allowing an accurate stack walk, but it doesn't look like we're currently emitting debug information to that level of accuracy. Not all debuggers/profilers understand this debug information, either (whereas walking the linked list emitted by the stack frames is trivial).

We could also start bundling debug builds of Phobos. However, these will not help in cases where the performance impact of using a full-blown debug build is not acceptable (e.g. if it'll skew the profiling results too much, or if you just want readable stack frames for your D web service in production).

How much will this cost in performance?

I've run two benchmarks, both show a figure around 0.1%. Many performance-sensitive parts of Phobos (std.algorithm) are templated and thus are not affected by the Makefile switches. The GC is built with -inline, which, although it causes the call stack to not contain inlined functions, doesn't cause it to abruptly break off like without stack frames.

Is D the first to build its release stdlib with stack frames?

Nope. Microsoft's C release runtime is built stack frames enabled.

Personally, I think the 0.1% is practically negligible considering the advantages. My proposal was rejected, so I'd like to hear more opinions about this. What do you think?

If you want to run some benchmarks yourself, here are the patches:

https://github.com/CyberShadow/phobos/compare/enable-stack-frames?expand=1
https://github.com/CyberShadow/druntime/compare/enable-stack-frames?expand=1

Or, using Digger:

digger build v2.065.0+CyberShadow/phobos/enable-stack-frames+CyberShadow/druntime/enable-stack-frames

Previous discussion from 2012:
http://forum.dlang.org/post/zebqmrhcigfuockcp...@forum.dlang.org

Reply via email to