summaryrefslogtreecommitdiffstats
path: root/src/readDwarf.cpp
Commit message (Collapse)AuthorAgeFilesLines
* DWARF tree for fully-qualified name constructionAlex Budovski2023-03-241-53/+149
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Windows debuggers expect PDB symbol names to be fully qualified. I.e., if a class Foo has a constructor, its name should be emitted as `Foo::Foo`, not simply `Foo` as is the case today. Linux debuggers like GDB dynamically reconstruct the symbol tree at runtime each time a program is debugged. Windows debuggers on the other hand do not, and expect the name to be fully qualified from the outset. Failing this, the constructor function `Foo` would have the same name as the class `Foo` in the PDB, and WinDbg will get confused about what to dump (e.g. using `dt Foo`) and arbitrarily pick the largest item, which might be the constructor. Therefore you end up dumping the wrong thing and being completely unable to inspect the contents of a `Foo` object. This commit aims to fix that by introducing a DWARF tree during the conversion process which allows us to efficiently reconstruct such fully qualified names during the conversion. A note about DWARF: the DWARF format does not explicitly record the parent of any given DIE record. It is instead implicit in how the records are layed out. Any record may have a "has children" flag, and if it does, then the records following it are its children, terminated by a special NULL record, popping back up one level of the tree. The DIECursor already recognized this structure but did not capture it in memory for later use. In order to construct fully-qualified names for functions, enums, classes, etc. (i.e. taking into account namespaces, nesting, etc), we need a way to efficienctly lookup a node's parent. Thus the DWARF tree was born. At a high level, we take advantage of the fact that the DWARF sections were already scanned in two passes. We hook into the first pass (where the typeIDs were being reserved) and build the DWARF tree. Then, in the second pass (where the CV symbols get emitted), we look up the tree to figure out the correct fully-qualified symbol names. NOTE: The first phase of this work focuses on subroutines only. Later work will enable support for structs/classes/enums. On the subroutine front, I also added a flag to capture whether a DIE is a "declaration" or definition (based on the DW_AT_declaration attribute). This is needed to consolidate function decl+defn into one PDB symbol, as otherwise WinDbg will get confused. This also matches what the MSVC toolset produces. A few other related additions: - Added helper to format a fully qualified function name by looking up the tree added in this commit. - Added helper to print the DWARF tree for debugging purposes and a flag to control it.
* Add comments to various filesAlex Budovski2023-03-241-0/+5
| | | | | This is just a preparatory change to improve the documentation in the code. No functional changes.
* DWARF5 rnglists and loclistsNeeraj Singh2021-12-021-31/+158
| | | | | Add support for the new opcode-based format for location lists and range lists.
* read all dwarf5 main DIE formsNeeraj Singh2021-12-021-4/+93
| | | | | Fill in Dwarf_InfoData for all DWARF5 forms excluding the new rnglists and loclists representations.
* Read DWARF5 header and add DWARF5 constants.Neeraj Singh2021-12-021-6/+19
| | | | | Handle the new DWARF5 compilation unit header and add new constants to dwarf.h. We still don't decode the new forms though.
* more pre-DWARF5 refactoring: unit headers, location cursor, range cursorNeeraj Singh2021-12-021-9/+103
| | | | | | | | | | | Read the compilation unit header byte-by-byte rather than by casting the data to a structure. Add the currentBaseAddress contextual info to the compilation unit data. Move the LOCCursor into readDwarf.cpp. Implement a RangeCursor similar to the LOCCursor. Add more debug printing.
* carry contextual information with the DIECursorNeeraj Singh2021-12-021-8/+13
| | | | | | | | | | DWARF5 has more contextual information that is associated with the compilation unit. As a preparation for using such information, carry it with the DIECursor and eliminate places where we're passing in the parent compilation unit. Also add the RDAddr helper to read a target-address according to the specification in the compilation unit.
* Refactor PE image section handling. Add debug logging.Neeraj Singh2021-12-021-36/+49
| | | | | | | | | | | Encapsulate dwarf-related PE sections into the PESection class. Remove some unused sections. Add helpers for common section operations. Move the context set via DIECursor::setContext to be static members of the class and add a debug context there. Add a standard method of enabling debug logging across the dwarf and PDB code.
* Improve merging DWARF_InfoDataMarc Aldorasi2019-02-061-1/+5
|
* Exclude artificial functions and inherit attributes from abstract originsMarc Aldorasi2019-02-041-0/+20
|
* Try harder to get function entry pointsMarc Aldorasi2019-02-041-0/+8
|
* DWARF: fixed converting unnamed structs/unions as part of other structsRainer Schuetze2019-01-251-0/+10
|
* DWARF: fix line info translation for pointer_size 8Rainer Schuetze2018-07-181-2/+2
| | | | do not assert for "Block" in DW_AT_upper_bound (but not supported)
* DWARF:Rainer Schuetze2018-04-211-5/+7
| | | | | | - fix code only executed in debug builds - fix evaluation of DW_OP_const1u/DW_OP_const1s not advancing pointer - add support for local variables with location list via DW_FORM_sec_offset
* Ignore, but still allow block and string forms for DW_AT_const_valuePierre-Marie de Rodat2018-03-231-3/+16
|
* CV2PDB::addDWARFEnum: new, first attempt at enum types translationPierre-Marie de Rodat2018-03-231-0/+5
|
* CV2PDB::getDWARFSubrangeInfo: use language-specific default lower boundPierre-Marie de Rodat2018-03-231-1/+5
|
* DWARF_InfoData: track the DW_AT_language attributePierre-Marie de Rodat2018-03-231-0/+1
|
* DWARF: fix finding sibling with multiple consecutive end tagsRainer Schuetze2018-02-231-1/+1
|
* fix building with VS2012 or earlierRainer Schuetze2017-06-181-8/+10
|
* fix DWARF for gcc 4.9.0 and clang 3.6Rainer Schuetze2015-06-121-1/+4
|
* DWARF: fix struct/class conversion, array limits, replace '.' with '@' in namesRainer Schuetze2015-06-091-1/+3
|
* DWARF: fix displaying locals if there are no function argumentsRainer Schuetze2015-06-091-1/+5
|
* fixes for gcc 4.6.3Rainer Schuetze2015-06-081-1/+1
|
* fix regression https://github.com/rainers/cv2pdb/issues/5: do not ignore ↵Rainer Schuetze2015-06-011-1/+8
| | | | | | virtual size of sections avoid assertions for DW_AT_ranges with constant data
* * DWARF: fixed issues with DW_FORM_ref_addr, DW_AT_upper_bound and ↵Rainer Schuetze2015-02-171-5/+17
| | | | | | DW_AT_lower_bound * DWARF: translate __int128 to CV code 0x14, just a wild guesss
* Build with Visual Studio 10 Compiler (Windows SDK 7.1)Mirko Scholz2015-01-221-1/+1
|
* Revamped location expression evaluator.Vadim Chugunov2014-12-051-178/+203
|
* Converted the remaining uses of the old decodeLocation().Vadim Chugunov2014-12-051-135/+1
|
* Updated mscvpdb.h with latest from WINE.Vadim Chugunov2014-12-051-2/+2
|
* Fix decodeLocation.Vadim Chugunov2014-12-051-16/+40
|
* Revamped DIE reading.Vadim Chugunov2014-12-051-84/+296
| | | | My decodeLocation.
* Fixed O^n abbrev search.Vadim Chugunov2014-12-051-0/+392
DIE tree navigation without requiring DW_AT_sibling attributes, moved navigation logic into DIECursor class.