我已經自己解決了這個問題。 因爲我不知道如何,並且似乎沒有直接返回位位置的方法,所以可以通過詢問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。
通過你想讀和1你想閱讀背後的價值,並讓GDB返回它們的地址值之前上市的一系列至少8內圍繞sensorBoutAdvance所有的變量:
* 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
由於一旦找到相同的地址,就會檢測到bitField。在這種情況下,可以在位5上找到sensorBoutAdvance。如果沒有找到雙地址,它可能不是一個bitField,但至少該位的位置並不重要。如果在要讀取的變量之後(而不是之前)找到相同的地址,則位位置位於第一位。
它肯定需要一些解析,但爲我工作,而無需添加外部程序或不同的語言。
注意:此方法只適用於所有位域只有1位長的情況。
實際的底層類型取決於'bool_t',它是什麼?不,沒有辦法獲得位的位置。哦,如果每一位都是「uint8_t」,那麼每一位肯定會有自己的地址,不會像現在這樣分享。 –
bool_t是一個無符號字符。而且,是的,這很明顯,重點是我只需要使用1個變量就可以知道它,而不是全部使用它們並檢查雙打。 – koldewb
C語言規範保證在位域中設置位設置那一點。編譯器如何實現它並不重要,但我認爲使用更大類型的實際位很常見(並且考慮到兩位使用相同的地址,似乎是您的編譯器實現,因爲它們是一個位較大型)。並回答你的問題,你想要的是不可能的,沒有支持它。你可以相信,如果你在比特場中有一點點,它將被正確處理。 –