Funktionsname aus PDB holen, dauert extrem lange



  • Hallo,

    ich habe einen StackTrace für Windows implementiert.

    Um den Funktionsnamen zu bekommen, nutze ich die Funktion:
    SymFromAddr

    stringstream result;
       // Symbol name
       ULONG64 symbolBuffer[(sizeof(SYMBOL_INFO) + MAX_SYM_NAME*sizeof(TCHAR) +
          sizeof(ULONG64) - 1) / sizeof(ULONG64)] = { 0 };
       PSYMBOL_INFO symbolInfo = reinterpret_cast<PSYMBOL_INFO>(symbolBuffer);
       symbolInfo->SizeOfStruct = sizeof(SYMBOL_INFO);
       symbolInfo->MaxNameLen = MAX_SYM_NAME;
       DWORD64 displacement(0);
       if (SymFromAddr(_process, address64, &displacement, symbolInfo))
       {
          result << symbolInfo->Name << " + 0x" << hex << displacement << " ";
       }
       else
       {
         printError("Can't retrieve FunctionName!";
       }
    

    Es liegt definitiv an der Funktion 'SymFromAddr'
    Ich weiß nicht wieso aber dieser Funktionsaufruf dauert extrem lange.
    Ich dachte es liegt vielleicht an den PDB's, einige sind 250MB groß.
    Vielleicht hat jemand mehr Erfahrung und weiß wieso?

    Oder vielleicht muss ich andere compiler optionen aktivieren oder die dbghelp anders initialisieren...



  • Es kommt darauf an, wo überall gesucht wird; teilweise wird auch im Internet nach dem public PDB symbolen gesucht; je nach Konfiguration... siehe auch:
    http://www.codeproject.com/KB/threads/StackWalker.aspx

    Siehe auch meine neueste Version:
    http://blog.kalmbachnet.de/files/LeakFinder-RC9.zip



  • Für das such Verzeichnis habe ich nichts angegeben, das hab ich auf NULL gesetzt.
    Dann nehme ich an der default ist, das nur im aktuellen verzeichniss gesucht wird, oder bzw. als erstes.

    Andere Frage was für Compiler-Einstellungen verwendest du im Release build?
    Ich habe im release Modus eingestellt, dass die Debug informationen generiert werden sollen (\Zi Format).
    Komischer weiße bekomme ich auch ohne die PDB's einen stacktrace(inkl. Funktionsnamen), aber die DLL's sind schon 100-200Kbyte größer, ich dachte da werden nur die PDB namen verlinkt.
    Was für informationen schreibt der compiler in die bin's noch rein, wenn er debug informationen generiert?


Anmelden zum Antworten