Skip to content
This repository has been archived by the owner on Oct 12, 2022. It is now read-only.

Commit

Permalink
Enable demangling of C++ symbols in the stacktrace
Browse files Browse the repository at this point in the history
This allows you to view demangled and pretty printed C++ symbols
in the stacktrace.
Is especially useful considering that D is getting more and more support for C++.

Now the C++ symbols in the stacktrace will be printed like this:
        test.d:7 [C++] Test<int>::SomeName(int, long, int) [0x55711efee36f]
        test.d:18 [C++] testcpp() [0x557228e17978]

Signed-off-by: Ernesto Castellotti <mail@ernestocastellotti.it>
  • Loading branch information
Ernesto Castellotti committed Mar 26, 2020
1 parent 36d80f7 commit 3e03206
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 3 deletions.
1 change: 1 addition & 0 deletions mak/COPY
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ COPY=\
$(IMPDIR)\core\internal\attributes.d \
$(IMPDIR)\core\internal\convert.d \
$(IMPDIR)\core\internal\cppdemangle.d \
$(IMPDIR)\core\internal\cppstack.d \
$(IMPDIR)\core\internal\dassert.d \
$(IMPDIR)\core\internal\destruction.d \
$(IMPDIR)\core\internal\entrypoint.d \
Expand Down
1 change: 1 addition & 0 deletions mak/SRCS
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ SRCS=\
src\core\internal\attributes.d \
src\core\internal\convert.d \
src\core\internal\cppdemangle.d \
src\core\internal\cppstack.d \
src\core\internal\dassert.d \
src\core\internal\destruction.d \
src\core\internal\entrypoint.d \
Expand Down
3 changes: 3 additions & 0 deletions mak/WINDOWS
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,9 @@ $(IMPDIR)\core\internal\convert.d : src\core\internal\convert.d
$(IMPDIR)\core\internal\cppdemangle.d : src\core\internal\cppdemangle.d
copy $** $@

$(IMPDIR)\core\internal\cppstack.d : src\core\internal\cppstack.d
copy $** $@

$(IMPDIR)\core\internal\dassert.d : src\core\internal\dassert.d
copy $** $@

Expand Down
3 changes: 2 additions & 1 deletion src/core/internal/cppdemangle.d
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
* Authors: Ernesto Castellotti
* Source: $(DRUNTIMESRC core/internal/_cppdemangle.d)
*/
module core.internal.cppdemangle;

/**
* Demangles C++ mangled names.
Expand Down Expand Up @@ -60,7 +61,7 @@ char[] cppdemangle(const(char)[] buf, char[] dst, bool withPrefix = false, strin
}
}

private char[] copyResult(const(char)[] input, char[] dst) @safe @nogc nothrow
package char[] copyResult(const(char)[] input, char[] dst) @safe @nogc nothrow
{
auto len = input.length <= dst.length ? input.length : dst.length;
dst[0..len] = input[0..len];
Expand Down
26 changes: 26 additions & 0 deletions src/core/internal/cppstack.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
module core.internal.cppstack;

__gshared Config config;
__gshared bool isInitialized;

struct Config
{
bool enable;
bool noprefix;
string prefix = "[C++]";
}

char[] demangleCppStack(const(char)[] buf, char[] dst)
{
import core.internal.parseoptions : initConfigOptions;
import core.internal.cppdemangle : cppdemangle, copyResult;

if (!isInitialized)
{
initConfigOptions(config, "cppstack");
isInitialized = true;
}

if (!config.enable) return copyResult(buf, dst);
return cppdemangle(buf, dst, !config.noprefix, config.prefix);
}
10 changes: 10 additions & 0 deletions src/core/runtime.d
Original file line number Diff line number Diff line change
Expand Up @@ -888,6 +888,16 @@ private:

auto sym = demangle(buf[symBeg .. symEnd], fixbuf[symBeg .. $]);

version (Shared)
{
import core.internal.cppstack;

if (sym == buf[symBeg .. symEnd]) // Retry with demangleCppStack
{
sym = demangleCppStack(buf[symBeg .. symEnd], fixbuf[symBeg .. $]);
}
}

if (sym.ptr !is fixbuf.ptr + symBeg)
{
// demangle reallocated the buffer, copy the symbol to fixbuf
Expand Down
14 changes: 13 additions & 1 deletion src/core/sys/windows/stacktrace.d
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,19 @@ private:
size_t decodeIndex = 0;
tempSymName = decodeDmdString(tempSymName, decodeIndex);
}
res ~= demangle(tempSymName, demangleBuf);
auto demangledName = demangle(tempSymName, demangleBuf);

version (Shared)
{
import core.internal.cppstack;

if (demangledName == tempSymName) // Retry with demangleCppStack
{
demangledName = demangleCppStack(tempSymName, demangleBuf, true);
}
}

res ~= demangledName;
return res;
}

Expand Down
16 changes: 15 additions & 1 deletion src/rt/backtrace/dwarf.d
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,21 @@ const(char)[] getDemangledSymbol(const(char)[] btSymbol, return ref char[1024] b
{
import core.demangle;
const mangledName = getMangledSymbolName(btSymbol);
return !mangledName.length ? buffer[0..0] : demangle(mangledName, buffer[]);
if (!mangledName.length) return buffer[0..0];

auto demangledName = demangle(mangledName, buffer[]);

version (Shared)
{
import core.internal.cppstack;

if (demangledName == mangledName) // Retry with demangleCppStack
{
demangledName = demangleCppStack(mangledName, buffer[]);
}
}

return demangledName;
}

T read(T)(ref const(ubyte)[] buffer) @nogc nothrow
Expand Down

0 comments on commit 3e03206

Please sign in to comment.