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;
这两个变量很接近。
一个程序崩溃了。我用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;
这两个变量很接近。