Да, это проблема восстановления типов шаблонов из отладочной информации. Формат отладочной информации DWARF не имеет абстрактного представления для шаблона. Он записывает только созданные экземпляры шаблонов (т. Е. Нет абстрактных std::vector<T>
, а только std::vector<int>
, vector<std::string>
и т. Д.
. Например, для создания базового типа "std :: string", необходимого для clangпоскольку приведение, из множества конкретных примеров, не является тем, чему lldb научили делать, и оно оказывается довольно сложным.
Вы можете обойти это на специальной основе, введя typedef длятипы, которые вы хотите напечатать, например:
(lldb) source list -l 1
1 #include <vector>
2 #include <string>
3 #include <stdio.h>
4
5 int
6 main()
7 {
8 using VecType = std::vector<std::string>;
9 std::vector<std::string> my_vec = {"string", "other string"};
10 void *hidden = (void *) &my_vec;
(lldb)
11 VecType *revealed = (VecType *) hidden;
12 return 0;
13 }
14
15
(lldb) expr *(std::vector<std::string> *) hidden
error: no member named 'vector' in namespace 'std'
error: expected '(' for function-style cast or type construction
error: expected expression
(lldb) expr *(VecType *) hidden
(VecType) $0 = size=2 {
[0] = "string"
[1] = "other string"
}
Это, очевидно, не очень хорошее решение, так как вы должны ввести эти typedef в ваш код, чтобы использовать их вотладчик. Кроме того, вам нужно не только определить их, но и использовать их, иначе компилятор не будет выдавать их в отладочную информацию. Поэтому, если бы я пропустил строку 11 выше, я бы получил:
(lldb) expr *(VecType *) hidden
error: use of undeclared identifier 'VecType'