Я работаю с базой кода 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 (которого у меня нет, к сожалению).
обратная совместимость зла, не так ли? – user463035818
Является ли база кода активно поддерживаться в хранилище, таком как github? Может ли это быть очищено в исходном коде, возможно, обновлено в репозитории, или вы можете его разветвить и очистить там? Если вы застряли с отключением GDB, это может быть вашим лучшим вариантом .... хотя подсчитать стоимость в часах, чтобы сделать это. –
Вы пытались использовать '$$', чтобы избежать этого? – sehe