Ниже приводится постановка задачи. Внизу мой актуальный вопрос, если в итоге вы просто скимаете формулировку задачи.
редактировать
Я забыл упомянуть: я связываюсь с --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 )