[win32/dbghelp] SymEnumSymbols() doet niets

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Ik ben radeloos. Ik heb een .pdb en ik wil weten welke symbols er allemaal in staan. Vrij simpel, zou je zeggen, met de DbgHelp API. Toch wil de functie totaal geen symbols enumereren, terwijl ik toch niet echt iets anders lijk te doen dan andere mensen op het internet. Een zoektocht naar "SymEnumSymbols() returns no results" of iets in die trant levert ook weinig relevante info op. M'n code:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <windows.h>
#include <DbgHelp.h>

#pragma comment(lib, "dbghelp")


BOOL CALLBACK EnumSymbolsProc(SYMBOL_INFO * pInfo, ULONG symSize, void * pContext)
{
    char undName[1024];
    UnDecorateSymbolName(pInfo->Name, undName, 1024, UNDNAME_COMPLETE);
    std::cout << undName << std::endl;
    return TRUE;
}

BOOL CALLBACK EnumSymbolsProc2(const char * name, ULONG addr, ULONG symSize, void * pContext)
{
    char undName[1024];
    UnDecorateSymbolName(name, undName, 1024, UNDNAME_COMPLETE);
    std::cout << undName << std::endl;
    return TRUE;
}

BOOL CALLBACK EnumLines(SRCCODEINFO * pInfo, void * pContext)
{
    std::cout << pInfo->FileName << ':' << pInfo->LineNumber << std::endl;
    return TRUE;
}


int main()
{
    //SymSetOptions(0);
    HANDLE hSym = GetCurrentProcess();
    SymInitialize(hSym, 0, FALSE);
    if (!SymLoadModuleEx(hSym, 0, "d:\\full_path_naar.pdb", 0, 0x00100000, 0x00100000, 0, 0))
    {
        std::cout << "Error loading pdb" << std::endl;
        return 0;
    }

    std::cout << "Loaded" << std::endl;

    // enumerate lines
    //SymEnumLines(hSym, 0x00100000, 0, 0, EnumLines, 0);

    // get specific symbol from address
    union
    {
        SYMBOL_INFO symInfo;
        char _data[1024];
    };
    symInfo.SizeOfStruct = sizeof(SYMBOL_INFO);
    symInfo.MaxNameLen = 1024 - sizeof(SYMBOL_INFO);
    DWORD64 disp;
    SymFromAddr(hSym, 0x00103df0, &disp, &symInfo);
    std::cout << symInfo.Name << std::endl;

    //IMAGEHLP_STACK_FRAME frame = { };
    //frame.InstructionOffset = 0x00103df0;
    //frame.StackOffset = 0x00200000;
    //if (!SymSetContext(hSym, &frame, 0))
    //  std::cout << "Error setting context" << std::endl;

    if (!SymEnumSymbols(hSym, 0x00100000, 0, EnumSymbolsProc, 0))
    //if (!SymEnumerateSymbols(hSym, 0x00100000, EnumSymbolsProc2, 0))
    {
        HRESULT r = GetLastError();
        std::cout << "Failed: " << r << std::endl;
    }

    SymCleanup(hSym);
}

Zoals je wel aan mijn comments kan zien heb ik al meerdere dingen geprobeerd. Verschillende combinaties van options voor SymSetOptions(), of het zetten van context op een functie waarvan ik weet dat ie op dat adres staat, de deprecated SymEnumerateSymbols() ipv SymEnumSymbols()... het mag allemaal niet baten. De enumeratie-functie geeft verder ook geen foutmelding, hij roept alleen mijn callback niet aan. En ik weet dat ie de symbol file wel goed inlaadt want de SymEnumLines() werkt wel, en ook SymFromAddr() werkt naar behoren.

Wat doe ik in hemelsnaam fout? Ik neig ernaar om gewoon zelf over de address space heen te wandelen en mbv SymFromAddr() op die manier alle globals te bemachtigen (want in feite ben ik alleen daarin geïnteresseerd)

[ Voor 4% gewijzigd door .oisyn op 24-02-2009 02:40 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
Ik zou je graag verder willen helpen, maar het enige dat ik kan zeggen is dat het bij mij wel gewoon werkt. Hij geeft alle symbols uit m'n pdb terug.

Geen idee of het er iets mee te maken zou kunnen hebben maar ik werk hier met de 32 bits variant van Vista..

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Yup, hier op m'n werk PC werkt het ook gewoon 8)7. Die draait overigens ook Windows XP x64, net als ik thuis.

[ Voor 37% gewijzigd door .oisyn op 24-02-2009 11:28 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Hmm, het lijkt aan m'n pdb te liggen. Als ik namelijk een pdb van thuis pak dan werkt het niet. Een pdb van hier op 't werk werkt wel. Het enige verschil is (vziw) dat ik thuis MSVC++ 2008 gebruik en hier zitten we nog op 2005.

Welke VS versie gebruik jij, Stukfruit?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 21-09 18:08

CoolGamer

What is it? Dragons?

Van DbgHelp.dll zijn verschillende versies in omloop. Dit zou kunnen verklaren dat hij niet met de nieuwste pdb files overweg kan. Misschien moet je gewoon de laatste Debugging Tools for Windows downloaden en van daaruit de dbghelp.dll kopiëren en bijvoegen. Volgens mij staat de licentie dit toe.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
.oisyn schreef op dinsdag 24 februari 2009 @ 14:54:
Welke VS versie gebruik jij, Stukfruit?
Ik gebruik hier 2008.

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Oh, ik dacht dat ik dat erbij had gezet, maar blijkbaar niet. Ik gebruik op beide machines de x64 versie van de laatste Debugging Tools. Overigens klopt m'n laatste conclusie ook niet, als ik de pdb pak van dit testappje zelf (op m'n werk) dan werkt het ook weer niet. Het moet dus een compiler/linker instelling zijn die ervoor zorgt dat de info al dan niet gegenereerd wordt. Iig heb ik hier een project waarbij het wel werkt, dus ik moet even het een en ander gaan vergelijken :)

.edit: pfff ik snap er niks van. De project settings zijn identiek, maar toch lukt het met de ene pdb wel en met de ander niet 8)7

[ Voor 12% gewijzigd door .oisyn op 24-02-2009 15:36 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Ok ik ben erachter. Twee dingen:

* De debugging tools is er in een 32 bits en een 64 bits uitvoering. Hoewel de downloadpagina duidelijk zegt dat je de 32 bits versie niet nodig hebt voor het debuggen van zowel 32-bits als 64-bits apps op een 64-bits processor, gaat dit blijkbaar niet op voor 32 bits apps die gebruik maken van de dbghelp API
* De installer replaced niet de default dbghelp.dll die bij je Windows komt. Je moet 'm naast je exe parkeren om ervoor te zorgen dat ie de geüpdate versie pakt ipv de default. En hierbij is het natuurlijk ook van belang dat je de juiste bits versie pakt, anders zal ie alsnog silently de default dll laden.

Met de laatste 32 bits dbghelp.dll in de dir van m'n tooltje werkt het dus gewoon wel 8)7

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1