2015-05-13 6 views
9

Я работаю с базой кода C++ с очень своеобразным стилем кодирования, включая префикс переменных-членов в классах с '$'. Для тех, кто никогда не сталкивался с этим раньше, он формально не является частью стандартов C++, а lurks around for backwards compatibility.

В качестве примера того, что я говорю о:

#include <iostream> 

class T { public: int $x; int y; }; 

int main() 
{ 
    T *t = new T(); 
    t->$x = t->y = 42; 
    std::cout << "t->$x = " << t->$x << std::endl; 
    delete t; 
    return 0; 
} 

Это представляет проблему в GDB. GDB обычно использует $ префиксные переменные в качестве волшебной удобной переменной (например, ссылаясь на предыдущие значения). Запустите GDB, установите точку останова в инструкции cout и попробуйте распечатать t->$x.

p t работает нормально. p *t работает нормально. p t->y работает нормально. p t->$x возвращает синтаксическую ошибку, предположительно ожидающую, что $ ссылается на удобную переменную.

В идеале, я бы полностью разделил $ s и проводил остаток своих дней, охотясь за тем, кто думал, что это хорошая идея (особенно для современной кодовой базы). Это нереально, но мне все же нужно иметь возможность использовать GDB для отладки.

Я надеюсь, что есть волшебный персонаж, но ничего, что я искал или не пытался, работал.

Примеры:

  • p this->'\044descriptor'
  • p this->'$descriptor'
  • p this->'$'descriptor
  • p this->\$descriptor
  • p this->\\$descriptor
  • p this->'\$descriptor'
  • p this->'\\044descriptor'
  • p this->$$descriptor
  • p this->'$$descriptor'

и так далее.

В этом конкретном случае я могу запустить функцию геттера (p this->getDescriptor()). Обширным обходным путем является печать всего содержимого класса (p *this). Я не уверен, что могу полагаться на обе эти бесконечно; некоторые из классов довольно велики, и большинство переменных-членов не имеют геттеров.

Это может быть классифицировано как ошибка в GDB, в зависимости от того, является ли хорошей идеей разорвать входные данные для поддержки этого. Однако, даже если это было исправлено, я застрял в GDB 7.2 для данной архитектуры/сборки.

Любые идеи?

ОБНОВЛЕНИЕ: python import gdb; print (gdb.parse_and_eval("t")['$x']), как указано в комментарии, работает, если у вас есть встроенный python (которого у меня нет, к сожалению).

+1

обратная совместимость зла, не так ли? – user463035818

+0

Является ли база кода активно поддерживаться в хранилище, таком как github? Может ли это быть очищено в исходном коде, возможно, обновлено в репозитории, или вы можете его разветвить и очистить там? Если вы застряли с отключением GDB, это может быть вашим лучшим вариантом .... хотя подсчитать стоимость в часах, чтобы сделать это. –

+0

Вы пытались использовать '$$', чтобы избежать этого? – sehe

ответ

1

Если вы получили версию gdb с расширениями python, возможно, функция «исследовать» поможет.

См https://sourceware.org/gdb/onlinedocs/gdb/Data.html#Data


    (gdb) explore cs 
    The value of `cs' is a struct/class of type `struct ComplexStruct' with 
    the following fields: 

     ss_p = 
     arr = 

    Enter the field number of choice: 

Поскольку вам не нужно имя переменной, вы должны быть в состоянии к шагу вокруг вопроса «$».

Смежные вопросы