Я хочу вывести значение тензора по lldb - PullRequest
0 голосов
/ 24 октября 2019

введите описание изображения здесь

Я хочу напечатать переменную члена буфера в buf_ ,, другими словами, я хочу p *(tensorflow::Buffer*)buf_, чтобы напечатать переменные члена в классе Buffer.

Коды в тензорном потоке, 1.10.1.

Отношения класса: класс TensorBuffer - это базовый класс в tenor.h, Buffer - это шаблон и производный класс в tenor.cc

Ниже приведен вывод lldb :

frame #0: 0x0000000175abffc0 

libtensorflow_framework.so`tensorflow :: Tensor :: Tensor (this = 0x000070000cadd308, a = 0x00007fd91ea61500, тип = DT_STRING, форма = 0x000070000cadd2f0) в тензорной точке: 101:7 * 625 * 5декодировать:

switch(type)

case DataTypeToEnum<string>::value :

{

    typedef string T;

    buf_ = new Buffer<T>(a, shape.num_elements(), allocation_attr);

}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

мы можем использовать тензорную функцию data () для решения этого вопроса.

например p (std::__1::string *)(tensor->buf_->data()) и почему мы можем использовать функцию data () в lldb?

0 голосов
/ 25 октября 2019

Да, это проблема восстановления типов шаблонов из отладочной информации. Формат отладочной информации 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'
...