2015-08-31 5 views
2

Я пытаюсь определить значения и размеры адресов с использованием вывода ARM .elf в GDB. С обычным p & и функциями печати я могу определить большинство адресов и и размеры переменных, но я не могу понять, является ли переменная bitValue или нет.Значения бит битов бит GDB

Для примера:

typedef struct 
{ 
    bool_t start; 
    bool_t running :1; 
    bool_t objectpoolUsable :1; 
    bool_t ready :1; 
    bool_t test :1; 
    bool_t stop :1; 
    uint8_t defaultMachine; 
}bitFieldTest; 

bitFieldTest bitValues; 

Задавая GDB для адреса «bitValues.ready» или «bitValues.running» он будет возвращать один и тот же адрес (так как он использует тот же адрес), но не дает мне бит позиции. Я также не знаю, действительно ли это битваль, или просто логическое значение, занимающее пространство uint8_t.

Чтобы уточнить, что мне нужно сделать: Дайте GDB только одно имя, что может быть bitValue и вернет мне правильный адрес и тип. Если этот тип является bitValue, мне нужно найти позицию бита. Для non-bitValues ​​это отлично работает, bitValues ​​вызывают проблемы на данный момент.

Является ли GDB способным дать какой-то выход для решения этой проблемы?

+0

Фактический базовый тип зависит от 'bool_t', что это такое? И нет, нет никакого способа получить битную позицию. О, и если каждый бит был целым 'uint8_t', то каждый бит определенно имел бы свои собственные адреса, а не делился, как сейчас. –

+0

bool_t - это символ без знака. И, да, это довольно очевидно, дело в том, что я должен знать это, используя только одну переменную, не используя их всех и проверяя удвоения. – koldewb

+0

Спецификация языка C гарантирует, что установка бит в битовое поле будет только установите этот бит. Точно так же, как компилятор реализует его, не имеет значения, но использование фактических битов в более крупном типе, я думаю, довольно распространено (и, похоже, это ваша реализация компиляторов, учитывая, что два бита используют один и тот же адрес, поскольку они являются одиночными битами в более крупный тип). И чтобы ответить на ваш вопрос, то, что вы хотите, невозможно, поддержки нет. Вы можете верить, что если у вас бит в битовом поле, он будет обработан правильно. –

ответ

0

Я уже решил эту проблему. Поскольку я не знаю, как, и, похоже, нет прямого способа вернуть позицию бита, его можно вычислить, запросив несколько адресов GDB.

Использование команды p & может определять адрес переменной, но не ее бит-поля или его битовую позицию. С помощью команды печати GDB на структуры, расположение bitValue мне нужно, он будет возвращать все доступные значения этой структуры, например:

Ищу для битового: MachineToUi.tramlining.sensorBoutAdvance

MachineToUi будет возвращать следующие:

$1 = {speedPls = {present = 0 '\000', time = 0, count = 0, noPulseCount = 0, 
value = 0, calDist = 0, calPulses = 0,END DATA ALL DATA: sampleTime = 0}, output = { 
trackMarkerL = 0 '\000', trackMarkerR = 0 '\000', 
workingLights = 0 '\000', foldingFrame = 0 '\000', 
tramlineShutoffL1 = 0 '\000', tramlineShutoffR1 = 0 '\000'}, input = { 
fanPpm = 0, workswitch1 = 0 '\000', workswitch2 = 0 '\000', 
speedSensor = 0 '\000', fanSensor = 0 '\000', meteringEncL = 0 '\000', 
motorEncL = 0 '\000', trackMarkerL = 0 '\000', trackMarkerR = 0 '\000', 
lowLvlHopperL = 0 '\000', venturiFlapL = 0 '\000', 
calButtonL = 0 '\000'}, hssoOutput = HSSO_IDLE, tramlining = { 
active = 0 '\000', restoreCfg = 0 '\000', updateCfg = 0 '\000', 
boutAdvance = 0 '\000', boutDecrement = 0 '\000', 
noTramlineIncDec = 0 '\000', displaySfks = 0 '\000', 
sensorBoutAdvance = 0 '\000', bout = 0 '\000'}, tramlineLeft = 0 '\000', 
tramlineRight = 0 '\000', diagOutputs = '\000' <repeats 11 times>, 
markerAutoDown = 0 '\000', fanRpm = 0, fanOffTime = 0, speed = 0, 
fsAlarmSensorNr = 0 '\000', fsAlarmDisconnectedSensorNr = 0 '\000', 
fsAlarmType = 0 '\000', seeding = 0 '\000', actMinSpeed = 0, 
actMaxSpeed = 0, lastSensorBout = 0 '\000', ctrMLeftUpFlash = 0 '\000', 
ctrMRightUpFlash = 0 '\000', folding = 0 '\000', startLeftOff = 0 '\000', 
startRightOff = 0 '\000', halfSideShutOff = 0 '\000', 
oldMarkerPosL = 0 '\000', oldMarkerPosR = 0 '\000', 
timeDateActive = 0 '\000', licVtCheck = 0 '\000', trialVtCheck = 0 '\000', 
trialAlarmActive = 0 '\000', workBeep = 0 '\000', warningBeep = 0 '\000', 
errorBeep = 0 '\000', runLed = 0 '\000', tcLicenseOk = 0 '\000', 
WDI_start = 0 '\000', newViewSeedCalRecRead = 0 '\000', 
MotorStopMarkerDelay = 0} 

Я заинтересован в переменной: sensorBoutAdvance.

Перечисляя все переменные вокруг sensorBoutAdvance в пределах диапазона, по крайней мере 8 до значения, которое необходимо прочитать и 1 за значение, которое вы хотите прочитать, и сделать GDB вернуть их адрес:

* calButtonL  0x2000435A 
* hssoOutput  0x2000435B 
* tramlining  0x2000435C 
* restoreCfg  0x2000435D 
* updateCfg  0x2000435E 
* boutAdvance  0x2000435F (Same address! Stop search!) 
* boutDecrement 
* noTramlineIncDec 
* displaySfks 
* sensorBoutAdvance (Known address by &p = 0x2000435F) 
* bout 
* tramlineLeft 
* tramlineRight 
* diagOutputs 
* markerAutoDown 
* fanRpm 
* fanOffTime 
* speed 
* fsAlarmSensorNr 
* fsAlarmDisconnectedSensorNr 

Как как только тот же адрес будет найден, обнаружен битField. И в этом случае sensorBoutAdvance можно найти на бит 5.Если двойной адрес не найден, это может быть не битField, но по крайней мере бит-позиция не имеет значения. Если тот же адрес найден сразу после вашей переменной, которую вы хотите прочитать (а не раньше), ваша позиция бита находится на первом бите.

Он обязательно требует некоторого разбора, но работает для меня без необходимости добавлять внешние программы или разные языки.

Примечание: Этот метод будет работать только тогда, когда все битовые поля имеют только 1 бит.

0

Невозможно получить эту информацию напрямую с помощью API выражения gdb. Для этого нет никакой серьезной причины - конечно, gdb знает битную позицию, но это следствие того, что выражения gdb имитируют отлаживаемый язык, а также тот, которого никто никогда не беспокоил, чтобы разоблачить его. Поскольку я никогда не слышал о том, чтобы кто-то хотел этого раньше, я думаю, можно с уверенностью сказать, что это редкий запрос.

Информация доступна через API-интерфейс gdb Python. В частности, если вы перебираете поля типа, объект Field будет иметь член bitpos, который имеет смещение бит данных. Обратите внимание, что смещение начинается с начала размещения struct.

Было бы довольно просто написать новую команду в Python, которая печатает эту информацию.

Смежные вопросы