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 */
我有点惊讶 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
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 */