std::chrono gdb漂亮的打印机

std::chrono gdb pretty printer

本文关键字:打印机 漂亮 gdb chrono std      更新时间:2024-05-10

我有点惊讶gdb没有为std::chrono持续时间类型提供开箱即用的漂亮打印机,因为它们是标准库的一部分。有了gdb 10.2(通过最新的Clion IDE,尽管这不应该是Clion特有的——它只是隐藏在引擎盖下的gdb(,我看到了毫无帮助的:

system_clock::m_time_counter = {std::chrono::nanoseconds}

而不是例如

system_clock::m_time_counter = 133ns

这迫使我每次都要扩展字段并深入挖掘类型,以显示持有我感兴趣的std::chrono::duration<long, std::ratio>::rep值的__r成员。我在ubuntu 20.04上,使用gdb 10.2

我对使用任何gdb漂亮的打印机持开放态度(欢迎使用python版本(,并希望确保我不会错过任何实现,这样我就不会重新发明轮子。

我最终在主目录中添加了一个.gdbinit文件,其中包含几行python,实现了我想要的单行值显示。

python # way to tell .gdbinit we enter a python section
import gdb
class ChronoPrinter:
def __init__(self, val):
self.val = val
def to_string(self):
integral_value = self.val['__r']
return f"{integral_value}"
p = gdb.printing.RegexpCollectionPrettyPrinter("sp")
p.add_printer("chrono", "^std::chrono::duration<.*>$", ChronoPrinter)
o = gdb.current_objfile()
gdb.printing.register_pretty_printer(o, p)
end # end of python section

然后我得到了美丽的景色:

system_clock::m_time_counter = {std::chrono::nanoseconds} 33

注意:repo中提到的libstdc++gdb打印机https://sourceware.org/gdb/wiki/STLSupport似乎只影响被忽略的类型名称(例如,将std::chrono::duration<long,std::ratio>转换为更友好的std::chrono::纳秒(。列出gdb会话中启用的打印机的一个有用命令是:

info pretty-printers

libstdc++-v6下的输出没有任何与chrono相关的内容。

> objfile /lib/x86_64-linux-gnu/libstdc++.so.6 pretty-printers:  
> libstdc++-v6
>     __gnu_cxx::_Slist_iterator
>     __gnu_cxx::__8::_Slist_iterator
>     __gnu_cxx::__8::__normal_iterator
>     __gnu_cxx::__8::slist
>     __gnu_cxx::__normal_iterator
... /*many more but nothing chrono related */