#include "dbghelp.h"

LONG CALLBACK HandleException(EXCEPTION_POINTERS* e) {
    HANDLE process = GetCurrentProcess();
    SymInitialize(process, NULL, TRUE);
    CONTEXT c = *e->ContextRecord;
    STACKFRAME64 s;
    s.AddrPC.Mode = AddrModeFlat;
    s.AddrStack.Mode = AddrModeFlat;
    s.AddrFrame.Mode = AddrModeFlat;
    s.AddrPC.Offset = c.Eip;
    s.AddrStack.Offset = c.Esp;
    s.AddrFrame.Offset = c.Ebp;
    DWORD offset_from_symbol=0;
    IMAGEHLP_LINE64 line = {0};
    DWORD64 displacement;
    IMAGEHLP_SYMBOL64 *sym = (IMAGEHLP_SYMBOL64*) new BYTE[sizeof(IMAGEHLP_SYMBOL64) + 1024];
    memset(sym, '\0', sizeof(*sym) + 1024);
    sym->SizeOfStruct = sizeof(*sym);
    sym->MaxNameLength = 1024;
    stringstream ss;
    ss << "snap|";
    int count = 0;

    do {
        if(!StackWalk64(IMAGE_FILE_MACHINE_I386, process, GetCurrentThread(), &s, &c,
            NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL))
            break;

        if(s.AddrPC.Offset != 0) {
            if(SymGetSymFromAddr64(process, s.AddrPC.Offset, &displacement, sym)) {
                //cout << sym->Name << endl;
            }
            if(SymGetLineFromAddr64(process, s.AddrPC.Offset, &offset_from_symbol, &line)) {
                string path = string(line.FileName);
                size_t pos = path.find_last_of("\\");
                string file = path;
                if(pos > 0) file = path.substr(pos + 1);
                if(count > 0) ss << ",";
                ss << file << "#" << sym->Name << "(" << line.LineNumber << ")";
            }
            count++;
        }
    } while(s.AddrReturn.Offset != 0);

    cout << ss.str() << endl;

    //return EXCEPTION_EXECUTE_HANDLER; // closes app
    //return EXCEPTION_CONTINUE_EXECUTION; // loops!?
    return EXCEPTION_CONTINUE_SEARCH; // yay!
}

Just call with: SetUnhandledExceptionFilter(HandleException);