c ++ объект в строку - PullRequest
       10

c ++ объект в строку

4 голосов
/ 01 декабря 2011

Я хотел бы вывести содержимое объекта C ++ (случается, это циклическая реализация буфера) в строку для целей ведения журнала. Я планировал сделать это вручную, но потом заметил, что запуск print-object на моем объекте в отладчике GDB дает мне прекрасный форматированный вывод, например:

(gdb) print audioDebugMessageQueue
$1 = {
  writePointer = 1, 
  readPointer = 0, 
  keys = {{
      samples = {0.155292124, 0.106764726}, 
      timeStamp = 1322767911, 
      numFrames = 1024
    }, {
      samples = {0, 0}, 
      timeStamp = 0, 
      numFrames = 0
    }, {
      samples = {0, 0}, 
      timeStamp = 0, 
      numFrames = 0
    }, {
      samples = {0, 0}, 
      timeStamp = 0, 
      numFrames = 0
    }, {
      samples = {0, 0}, 
      timeStamp = 0, 
      numFrames = 0
    }, {
      samples = {0, 0}, 
      timeStamp = 0, 
      numFrames = 0
    }, {
      samples = {0, 0}, 
      timeStamp = 0, 
      numFrames = 0
    }, {
      samples = {0, 0}, 
      timeStamp = 0, 
      numFrames = 0
    }, {
      samples = {0, 0}, 
      timeStamp = 0, 
      numFrames = 0
    }, {
      samples = {0, 0}, 
      timeStamp = 0, 
      numFrames = 0
    }}
}

Если GDB может получить доступ к хорошему дампу моего объекта, я думаю, что, вероятно, тоже могу. Но как? Я на iOS, кстати.

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Причина, по которой GDB может дать вам этот приятный вывод, заключается в том, что при указании (опция -g для gcc) компилятор генерирует, в дополнение к обычному коду, некоторую дополнительную информацию о том, как интерпретировать двоичные структуры вваша программа.Отладчик считывает и интерпретирует эту дополнительную информацию, а затем, когда вы печатаете объект, он использует ее для вывода вашего объекта.Обратите внимание, что если вы не включите отладочную информацию в свои файлы (т.е. если вы не используете -g), то GDB не сможет дать вам такие хорошие отпечатки, даже если вы точно скажете, где находится эта переменная (другая информация - информация об отладке).содержит).

Теперь вы, безусловно, могли бы написать код для чтения этой отладочной информации для вашей программы и затем использовать ее для отображения классов (или, если это разрешено лицензированием, даже использовать для нее существующий код).Однако, если вы не используете его для очень многих различных типов (и вы согласны с ограничением, которое вы должны компилировать с отладочной информацией, которая может помочь людям в обратном проектировании вашего кода), почти наверняка легчепросто напишите код печати вручную.

Еще один вариант, конечно, будет требовать установки gdb и вызывать его из вашей программы, чтобы сгенерировать вывод.Это, вероятно, не то, что вы хотели бы сделать, однако (это будет обходить любые вопросы лицензирования).

1 голос
/ 02 декабря 2011

Напишите операторы вставки потока для каждого из классов в вашем классе, затем для самого класса, а затем для контейнера.

template<class E, class T>
std::basic_ostream<E,T> &operator <<( std::basic_ostream<E,T> &s, const sometype & a ) { /* ... */ }

template<class E, class T>
std::basic_ostream<E,T> &operator <<( std::basic_ostream<E,T> &s, const C& a_c ) 
{
     s << std::hex << std::setw(8) << a_c.a << std::endl
       << a_c.b;
}

template<class E, class T>
std::basic_ostream<E,T> &operator <<( std::basic_ostream<E,T> &s, const Cvector & cvec  ) 
{
     for ( iterator i = cvec.begin(); i != cvec.end(); ++i )
          s << *i << std::endl;
}

[Рассмотрим этот псевдокод ...]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...