GDB: можно ли привести / переосмыслить последовательность в терминах пользовательской структуры, которая отсутствует в символах отладки - PullRequest
0 голосов
/ 22 сентября 2011

Ниже приводится постановка задачи. Внизу мой актуальный вопрос, если в итоге вы просто скимаете формулировку задачи.

редактировать

Я забыл упомянуть: я связываюсь с --no-strip-discarded --discard-none. Один из объектных файлов (предварительная ссылка) сопоставляется grep, когда я ищу нужный тип, но я не нахожу эту строку после выгрузки информации из объектного файла с nm, objdump и readelf.


Я смотрю на некоторый код на C, который использует идиому в следующем виде:

// somecode.h
typedef struct {
  // ...
  volatile unsigned char *member1;
} Type1_t;

typedef struct {
  unsigned int member1:16;
  unsigned int member2:32;
  unsigned int member3:16;
} Type2_t;

// somecode.c
// ...

void someFunction( Type1_t *type1Ptr ) {
  // ...
  doSomething( ((Type2_t*)type1Ptr->member1)->accessType2Member );
}

Пожалуйста, игнорируйте любые ваши возражения против стиля кодирования, это не мой вопрос.

В этом случае экземпляр Type2_t никогда не создается, поэтому, насколько я могу судить, компилятор определил, что нет необходимости выдавать отладочную информацию о типе.

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

watch {char[12]}type1Ptr->member1

... но помимо фактического отображения member1, member2, & member3, симпатичный принтер для массивов символов печатает его в виде последовательности \000\032\021 ... и т. Д. (Примечание: я нахожусь в У Solaris и GDB 7.2 в Solaris есть проблемы с libiconv , который GDB использует для переводов кодовых страниц. Я сейчас застрял с ISO-8859-1. Я не уверен, что именно поэтому он этого не делает просто распечатайте его как последовательность шестнадцатеричных символов), поэтому мне придется либо печатать содержимое с помощью display, либо каким-либо другим механизмом, а затем интерпретировать содержимое в моей голове.


Что я ищу:

  • Есть ли способ заставить gcc испускать все символы отладки, даже если рассматриваемый тип появляется только при выполнении приведения?
    • ... или если тип вообще не используется в реальном коде
  • Могу ли я просто как-то включить заголовок в gdb, чтобы определить тип?
  • Этот, вероятно, надуман, но: gdb имеет какое-либо средство для выполнения более сложных приведений, чем просто приведение к определенным в настоящее время типам? Например, есть ли способ сделать что-то вроде следующего

(gdb) print {struct { unsigned int:16 member1; unsigned int:32 member2;
          unsigned int:16 member3;} }( type1Ptr->member1 )

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Похоже, этот вопрос / ответ заботится о 2-м вопросе и как бы облегчает необходимость # 3.

0 голосов
/ 22 сентября 2011

У меня есть ответ на проблему недоступности информации о типе. Я добавил -gstabs+ к своим CFLAGS:

CFLAGS = (...) -ggdb3 ----> -gstabs+ <---- (...)

... и теперь GDB может рассказать мне полезную информацию о рассматриваемом типе.

Мне все еще интересны ответы на два других вопроса, хотя, если кто-то захочет попробовать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...