使用 lldb 调试时重写模板名称

Rewrite template names when debugging with lldb

使用模板调试 C++ 程序时,输出很快就会变得不可读。因此,在调试会话期间重写缩短特定类型名称会很方便。

例如

void std::__1::vector<std::__1::tuple<unsigned long,
                                      state_change_t,
                                      some::namespace::Board<some::namespace::Tile, unsigned long, 42ul>,
                                      some::namespace::Path<unsigned int, unsigned int>>,
                      std::__1::allocator<std::__1::tuple<unsigned long,
                                                          state_change_t,
                                                          some::namespace::Board<some::namespace::Tile, unsigned long, 42ul>,
                                                          some::namepsace::Path<unsigned int, unsigned int>
                                                          >
                                          >
                      >::some_interesting_method

这样的条目可以在回溯的一行中出现多次;这很快变得难以管理。因此,将其缩短为

这样的内容会很方便
void void std::__1::vector<my_known_type,
                           std::__1::allocator<my_known_type>
                          >::some_interesting_method

如何做到这一点?

Clang 有一个名为 preferred_name 的属性,可用于为 compile-time 诊断创建模板别名。它需要一些前向声明,像这样:

template<typename T>
struct Heap;

using IntHeap = Heap<int>;

template<typename T>
struct [[clang::preferred_name(IntHeap)] Heap;
// Possibly add implementation, don't have to yet.

遗憾的是,自 2021 年 9 月起,clang 将不会在编写调试符号时使用它。有个mailing list thread discussing this change and the diff is here.

Clang 版本 12 和 13 仍应在调试符号中使用首选名称,但这是一个非常狭窄的版本 window。

打开请求添加一个标志以在调试符号中启用首选名称的请求可能是值得的 - 这似乎是一个非常微不足道的功能,但非常有用。