QString CrashHandler::getStacktrace()
{
    #ifdef _WIN32
    //StackTracer tracer;
    //tracer.runStackTracerForAllThreads();
    //return tracer.theOutput();
    //dbg::stack s;
    //std::stringstream out;
    //std::copy(s.begin(), s.end(), std::ostream_iterator<dbg::stack_frame>(out, "\n"));
    std::string stack;
    GetStackWalk(stack);
    return QString::fromStdString(stack);
    #elif (defined(__linux__) && !defined(__ANDROID__)) || defined(__APPLE__)
    void *array[401];
    int size;
    char **strings;
    size = backtrace(array, 400);
    strings = backtrace_symbols(array, size);
    QString bkTrace("");

    for(int j = 0; j < size; j++)
        bkTrace += QString(strings[j]) + "\n";

    return bkTrace;
    #else
    return QString("");
    #endif
}
示例#2
0
static std::string getStacktrace()
{
#if defined(_WIN32)
    //StackTracer tracer;
    //tracer.runStackTracerForAllThreads();
    //return tracer.theOutput();
    //dbg::stack s;
    //std::stringstream out;
    //std::copy(s.begin(), s.end(), std::ostream_iterator<dbg::stack_frame>(out, "\n"));
    std::string stack;
    GetStackWalk(stack);
    return stack;
#elif (defined(__linux__) && !defined(__ANDROID__) || defined(__APPLE__))
    void  *array[400];
    int size;
    char **strings;
    D_pLogDebug("Requesting backtrace...");
    size = backtrace(array, 400);
    D_pLogDebug("Converting...");
    strings = backtrace_symbols(array, size);
    D_pLogDebug("Initializing std::string...");
    std::string bkTrace("");
    D_pLogDebug("Filling std::string...");

    for(int j = 0; j < size; j++)
    {
        bkTrace.append(strings[j]);
        bkTrace.push_back('\n');
    }

    D_pLogDebug("DONE!");
    return bkTrace;
#else
    return std::string("<Stack trace not supported for this platform!>");
#endif
}