首先交代一下背景,我在调试这样一段代码的时候,一直出现 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) 前,堆栈,变量都是正常的。
但是一旦进入 read_until 后,Connector *conn的值居然被修改了。
而且参数也是正常的,这就非常奇怪。
经过一下午的查找,最后终于发现问题所在。
char data[1024];
关键在于我在Message函数中开一个很大的栈空间,导致爆栈了,并且刚好修改了conn的值。
之后将栈空间开小一点或者使用堆,问题解决!