Как распечатать и использовать константы с GDB (через XCode)? - PullRequest
5 голосов
/ 14 мая 2009

Я отлаживаю приложение Какао, используя xcode-gdb. Я нахожусь в точке останова, и я хочу просмотреть значение некоторых констант Какао (например, NSControlKeyMask) и провести некоторый тест со значениями в текущем стеке В частности, я нахожусь в

- (void) keyDown:(NSEvent *) e 
, и я сделал
set $mf = (int)[e modifierFlags]
в приглашении GDB. Теперь я хочу сделать
p $mf & NSControlKeyMask
, и GDB говорит мне: «Нет символа« NSControlKeyMask »в текущем контексте.»

UPDATE:
Xcode имеет функцию « Исправить и продолжить текст ». Поэтому я использовал Dan M. и решение n8gray с этой функцией, поэтому мне не нужно создавать прокси для каждой константы.

Ответы [ 5 ]

6 голосов
/ 24 мая 2009

Если никакие переменные на самом деле не созданы с данным типом, то отладочная информация для соответствующих символов не будет сгенерирована gcc. Затем, если вы спросите GDB о таком типе, он не будет знать, о чем вы говорите, потому что для этого типа нет отладочной информации, и он выдаст вам ошибку «Нет символа в текущем контексте».

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

enum an_enum_type {
  foo,
  bar,
  baz
};

int main (int argc, char *argv [])
{
  return baz;
}

Сохраните эту программу в файл с именем test.cpp и скомпилируйте его с помощью этой команды:

g++ -o test -g -O0 test.cpp

Затем запустите его под GDB и введите "p / x baz". Вы получите ошибку «Без символа в текущем контексте».

Теперь попробуйте это с этой модифицированной версией, которая добавила фиктивную переменную типа enum:

enum an_enum_type {
  foo,
  bar,
  baz
};

an_enum_type dummy;

int main (int argc, char *argv [])
{
  return baz;
}

Скомпилируйте с помощью той же команды, что и раньше, и запустите под GDB. На этот раз, когда вы введете «p / x baz», вы получите «0x2» в качестве ответа, и я думаю, что вы стреляете в свой вопрос.

Я изучил это, и проблема в том, что заголовочный файл NSEvent.h не дает имени для перечисления, содержащего NSControlKeyMask - это анонимное перечисление. Таким образом, нет способа создать переменную этого типа (фиктивная или иная). Итак, я не вижу способа заставить компилятор генерировать отладочную информацию для этого типа. Я думаю, вы просто должны полагаться на определение NSControlKeyMask из заголовочного файла.

3 голосов
/ 14 мая 2009

Если вы компилируете с помощью gcc, вы можете использовать переключатель -g3, чтобы получить наивысший уровень отладочной информации. Цитирование из раздела -g в руководстве по gcc :

-glevel
    Request debugging information and also use level to specify how much information. The default level is 2.

    Level 0 produces no debug information at all. Thus, -g0 negates -g.

    Level 1 produces minimal information, enough for making backtraces in parts 
            of the program that you don't plan to debug. This includes descriptions
            of functions and external variables, but no information about local 
            variables and no line numbers.

    Level 3 includes extra information, such as all the macro definitions present 
            in the program. Some debuggers support macro expansion when you use
            -g3. 

Так что, если вы компилируете с -g3, вы должны иметь возможность расширять константы и макросы в GDB.

2 голосов
/ 25 мая 2009

Как обнаружил Дэн М., вы, вероятно, не можете заставить это работать простым способом. Вместо этого вы можете поместить что-то вроде этого в один из ваших файлов:

int myNSControlKeyMask = NSControlKeyMask;
int myNSOptionKeyMask = NSOptionKeyMask;
...

Тогда, по крайней мере, вы можете использовать символические имена в GDB без необходимости искать соответствующие значения в файле .h.

1 голос
/ 14 мая 2009

NSControlKeyMask, скорее всего, макрос и невидим для отладчика. Вам нужно поискать в соответствующем .h файле. Наведите курсор на текст NSControlKeyMask в редакторе и попробуйте команду + двойной щелчок, чтобы перейти к его определению.

0 голосов
/ 03 сентября 2009

Кажется, я получаю ту же проблему в связке кода C ++, который вызывается из Obj-C в приложении для iPhone. Это дает мне
В текущем контексте нет символа «а».
ошибка, где a является int. Я попробовал флаг компилятора -g3 безуспешно. Мне трудно поверить, что GDB не знает тип int. SDK 3.0, но опять же, GDB печатал совершенно ошибочные значения, когда он мог найти переменную в программе.

...