0

我遇到了分段错误(核心转储)错误并尝试使用 gdb 进行调试。我发现错误发生在哪里:

Program received signal SIGSEGV, Segmentation fault.
0x08048edb in state_update2 () at xxx.cpp:333
333     if (rob.head->is_complete == 1 && rob.head->ready_to_retire == 1 )

几行代码是:

    if(rob.head->is_complete == 1 && rob.head->ready_to_retire == 1) {
        reorder_buffer_node *temp = new reorder_buffer_node[sizeof(struct reorder_buffer_node)];
        temp = rob.head;
        for(uint64_t i=0; i<f_; i++) {
            if(temp->is_complete == 1 && temp->ready_to_retire == 1) {
            rob.pop();
            retired_inst++;
            temp = temp->next;
            }
            else break;
        }
    }

ROB 是一个循环队列,head 是一个指向以下结构的指针:

struct reorder_buffer_node {
    int is_complete;  
    uint64_t instr_num;
    uint64_t dest_reg;
    uint64_t index;
    reorder_buffer_node *next;
    int ready_to_retire;
};

我没有以正确的方式访问结构的成员吗?请告诉我!

4

3 回答 3

2
reorder_buffer_node *temp = new reorder_buffer_node[sizeof(struct reorder_buffer_node)]; 

//你是否试图创建一个 reorder_buffer_node 数组并命名为 temp?

temp = rob.head;

//有了上面的注释,这一行就不会发生

temp = temp->next;

//您还没有为结构编写任何构造函数,因此使用默认构造函数,它的 temp 将被分配给垃圾或 NULL。当您执行上述步骤时,它可能会提供分段错误或崩溃。所以最好写一个构造函数。

如果采取以下步骤,它将正常运行。

于 2013-11-12T18:32:03.233 回答
1

I don't have enough context to say for sure but I would start with these two lines:

reorder_buffer_node *temp = new reorder_buffer_node[sizeof(struct reorder_buffer_node)];
temp = rob.head;

Which destroy the value of the new in a way similar to:

int temp = 15;
temp = 5;
于 2013-11-12T18:24:15.567 回答
0

如果我理解你正确地崩溃发生在 if()? 所以,正如你提到的 head 是一个指针,那么它可能没有分配?如果是这样,下面的代码给出了分段错误:

if(rob.head->is_complete == 1 && rob.head->ready_to_retire == 1)

要检查它,您可以只打印出指针或为此指针添加 NULL 检查。

于 2013-11-12T18:28:31.800 回答