Here's something I encountered today when writing some C++:

try
{
    throw std::runtime_error("some message");
}
catch (std::exception e)
{
    std::cout << "error: " << e.what() << std::endl;
}

When run, this code will write "error: St9exception", instead of "some message" to stdout. "St9exception" comes from libstdc++, in which the default value returned by std::exception::what() is the mangled symbol name. The mistake was that I was catching the exception by value, not by reference. (Too much C# perhaps?)

Instead it should have of course been:

try
{
    throw std::runtime_error("some message");
}
catch (const std::exception & e)
{
    std::cout << "error: " << e.what() << std::endl;
}