记录一次非常离谱的Bug经历

110 阅读1分钟

首先交代一下背景,我在调试这样一段代码的时候,一直出现 Segmentation fault 错误。

void Message(Connector *conn, Setting *setting) {
    char data[1024];

    printf("in Message id: %d \n", conn->t->id);

    conn->read_until(data, 24);

    // conn->close();
}
class Connector {
private:
public:
    task *t = NULL;
    
    void read_until(void *data, int size) {
        printf("read some bytes\n");
        
        printf("context id: %x", t->id);
        
        // lock
        task_wait_list.push_back(t);
        swapcontext(&t->context, &t->parent);

        printf("read remain bytes\n");
    }
};

使用 gdb 定位到 Message 函数,发现一个奇怪的现象。 在执行 conn->read_until(data, 24) 前,堆栈,变量都是正常的。 image.png

但是一旦进入 read_until 后,Connector *conn的值居然被修改了。

image.png

而且参数也是正常的,这就非常奇怪。 image.png

经过一下午的查找,最后终于发现问题所在。

char data[1024];

关键在于我在Message函数中开一个很大的栈空间,导致爆栈了,并且刚好修改了conn的值。 之后将栈空间开小一点或者使用堆,问题解决!