std::chrono gdb 漂亮的打印机

std::chrono gdb pretty printer

我有点惊讶 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 似乎只影响显示的类型名称(例如 turn std::chrono::duration进入更友好std::chrono::nanoseconds)。 在 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 */