Если никакие переменные на самом деле не созданы с данным типом, то отладочная информация для соответствующих символов не будет сгенерирована 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
из заголовочного файла.