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:
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)
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.