[Bug 50638] New: Builtin Dbghelp.dll doesn't succesfully load symbols from a FakePDB PDB file

WineHQ Bugzilla wine-bugs at winehq.org
Sun Feb 7 17:11:21 CST 2021


https://bugs.winehq.org/show_bug.cgi?id=50638

            Bug ID: 50638
           Summary: Builtin Dbghelp.dll doesn't succesfully load symbols
                    from a FakePDB PDB file
           Product: Wine
           Version: 6.1
          Hardware: x86-64
                OS: Linux
            Status: UNCONFIRMED
          Severity: minor
          Priority: P2
         Component: dbghelp
          Assignee: wine-bugs at winehq.org
          Reporter: lorenzofer at live.it
      Distribution: ArchLinux

Hi.

FakePDB is a plugin for IDA PRO 7.x that from the current program and database
loaded into IDA , generate a PDB file compatible with debuggers.

I created a PDB  for Oblivion.exe (the executable of the game The Elder Scroll
Oblivion) as I weanted to try the system (and Oblivion has many internal
definition decoded from various projects, from OBSE to OblivionReloaded)

So  I tried triggering a CTD (knowing a way to make the game crash immediatly)
but the winedbg wasn't loading the symbols, sometimes causing a crash of the
winedbg itself.
In the terminals there were a lot of:
04f4:fixme:dbghelp:symt_get_address Unsupported sym-tag --- for get-address

Going down the rabbit hole, I tried to see if I could get the value of the
sym-tag, adding a print, but the value was nonsensical (1114872 in decimal) too
big to be valid.
I continued to debug:
0584:trace:dbghelp_msc:pdb_init PDB(C:\Games\Oblivion\Oblivion.pdb): "Microsoft
C/C++ MSF 7.00\r\n\x1aDS\x00\
0584:trace:dbghelp_msc:pdb_init found DS for C:\Games\Oblivion\Oblivion.pdb:
age=1 guid={7bbd0a3a-8959-474f-aba3-082cd018c220}
0584:trace:dbghelp_msc:pdb_init
PDB(e:\NetworkProjectsPC\OblivionSE\Oblivion\Game\Oblivion.pdb): "Microsoft
C/C++ MSF 7.00\r\n\x1aDS\x00\
0584:trace:dbghelp_msc:pdb_init found DS for
e:\NetworkProjectsPC\OblivionSE\Oblivion\Game\Oblivion.pdb: age=1
guid={7bbd0a3a-8959-474f-aba3-082cd018c220}
0584:trace:dbghelp_symt:symt_new_public Adding public symbol L"oblivion":$LN21
@98124f
0584:trace:dbghelp_symt:symt_new_public Added public symbol L"oblivion":$LN21
@98124f   a

The PDB is found and loaded properly, and the first symbol is succesfully
added.
However after the first symbol is added all the others start to fail:

0584:trace:dbghelp_symt:symt_new_public Adding public symbol
L"oblivion":??0?$LockFreeMap at PBDPAVKFModel@@@@QAE at XZ @438f10
0584:fixme:dbghelp:symt_get_address Unsupported sym-tag 1114872 for get-address
0584:trace:dbghelp_symt:symt_new_public Failing 10014  10000  10000 1465e64
(I added some traces to understand a bit better what's was going on, but the
issue should be clear)


Here seems to be that dbghelp_options is SYMOPT_AUTO_PUBLICS  and
symt_find_nearest(module, address) return a non-null address, so the function
symt_new_public  return null.
For every symbols except the first and the :EntryPoint symbol.


For now the only workaround I found is to comment this part of the code:
    if ((dbghelp_options & SYMOPT_AUTO_PUBLICS) == SYMOPT_AUTO_PUBLICS && (sym
= symt_find_nearest(module, address) != NULL)){
        return NULL;
    }

And everything seems to work again, but  I don't know if by doing this I broke
something else.


FakePDB code: https://github.com/Mixaill/FakePDB
(It use LLVM to generate the PDB file)

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list