date icon indicating copy to clipboard operation
date copied to clipboard

pretty-print for time_point

Open piratkin opened this issue 3 years ago • 4 comments

Is it possible to add pretty-print to humanly display time_point in the gdb debugger?

piratkin avatar Mar 02 '21 08:03 piratkin

I don't know what's involved in doing that.

HowardHinnant avatar Mar 02 '21 14:03 HowardHinnant

The debugger displays time_point as a number, from which it is difficult to understand what date and time it represents: timeunit The GDB debugger uses special scripts to represent complex binary structures such as strings, containers, etc. in a readable format. for example It would be very convenient to be able to understand the date and time during debugging in GDB.

piratkin avatar Mar 02 '21 15:03 piratkin

On first glance it doesn't appear that this requires any changes to the date lib.

I am not the right person to develop these scripts. For one, I don't have gdb installed to test them with.

Perhaps someone has already done this? time_point has been part of the std <chrono> header for a decade now.

HowardHinnant avatar Mar 02 '21 15:03 HowardHinnant

I checked in 8 and 10 (GDB) versions:


...

def register_type_printers(obj):
    global _use_type_printing

    if not _use_type_printing:
        return

...

    # Add type printers for <chrono> typedefs.
    for dur in ('nanoseconds', 'microseconds', 'milliseconds',
                'seconds', 'minutes', 'hours'):
        add_one_type_printer(obj, 'duration', dur)

...

other than that I couldn't find anything else in /usr/share/gcc...

Found discussion on a similar topic Tried adding to my .gdbinit:

python
import gdb.printing

def nsepoch_to_time(ns, precision=6):
    return "time"

class NSSinceEpochPrinter:
   def __init__(self, val):
      self.val = val

   def to_string(self):
      if self.val.address and self.val.address != 0 and not self.val.is_optimized_out:
         return nsepoch_to_time(int(self.val["__d"]["__r"]))
      else:
         return "<unknown>"

def build_pretty_printer():
   pp = gdb.printing.RegexpCollectionPrettyPrinter("iat_clocks")
   pp.add_printer('NSSinceEpoch', '^std::chrono::time_point<my_ns_since_epoch_clock_impl.*1000000000', NSSinceEpochPrinter)
   return pp

end

But I didn't see any result.

In MSVC, the situation is similar:

timeunit_msvc

Windows 10 x64 Microsoft Visual C++ 2019

piratkin avatar Mar 03 '21 11:03 piratkin