gdb watch a variable by address stop at where it cannot modified

gdb watch a variable by address stop at where it cannot be modified

一个程序崩溃了。我用gdb查看,发现一个实例的private member以一种很奇怪的方式被改变了。此变量 refreshRank 仅在第 283 和 286 行被修改。我使用 gdb 通过观察其地址来观察 refreshRank,即 watch *0x5555559ec278。当我在 class 的成员函数中时,我通过 p &refreshRank 获取地址。 但是用watch命令,gdb说修改refreshRank的地方在第594行之前。但是不能修改! refreshRank 在这些行中甚至没有被引用,正如 l 命令给出的那样。

Hardware watchpoint 1: *0x5555559ec278

Old value = 0
New value = 1
DRAMSim::MemoryController::update (this=0x5555559ec020) at MemoryController.cpp:594
594             newTransactionBank, transaction->data, dramsim_log);
(gdb) l
589                 totalReads[transaction->core]++;
590                }
591 
592            BusPacket *command = new BusPacket(bpType, transaction->address,
593             newTransactionColumn, newTransactionRow, newTransactionRank,
594             newTransactionBank, transaction->data, dramsim_log);
595 
596 
597 
598             commandQueue.enqueue(ACTcommand);

所以我想知道,这怎么会发生?变量在不能修改的地方被修改

正如@j6t 指出的那样,它执行的最后一行 totalReads[transaction->core]++;transaction->core 超出了范围。在 class 定义中:

uint64_t totalReads[NUM_CPU];
uint64_t totalPrefReads[NUM_CPU];
uint64_t totalWrites[NUM_CPU];


unsigned channelBitWidth;
unsigned rankBitWidth;
unsigned bankBitWidth;
unsigned rowBitWidth;
unsigned colBitWidth;
unsigned byteOffsetWidth;
int totalRead, totalWrite;

unsigned refreshRank;

这两个变量很接近。