Как распечатать и использовать константы с gdb (через XCode)?

Вы не можете сделать это. Потому что для некоторых сокращений у нас есть несколько полных названий: «AMT» означает UTC + 4 (время Армении), а также «AMT» означает UTC-4 (время Amazon). Вот почему Microsoft не добавила это в свой класс TimeZoneInfo. Я думаю, что гораздо лучше поговорить с клиентом и решить, какой словарь вы будете использовать.

Список сокращений можно найти здесь: https://www.timeanddate.com/time/zones/

Извините за плохие новости.

5
задан gcamp 5 September 2011 в 06:22
поделиться

5 ответов

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

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

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 / х баз ". Вы получите ошибку «Нет символов в текущем контексте».

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

типа 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 из файла заголовка.

типа 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 из файла заголовка.

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

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

6
ответ дан 13 December 2019 в 05:41
поделиться

Если вы компилируете с помощью 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.

3
ответ дан 13 December 2019 в 05:41
поделиться

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

1
ответ дан 13 December 2019 в 05:41
поделиться

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

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

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

2
ответ дан 13 December 2019 в 05:41
поделиться

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

0
ответ дан 13 December 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: