我的程序中有一个奇怪的错误,在我看来 malloc() 导致了 SIGSEGV,据我所知,这没有任何意义.我正在为动态列表使用一个名为 simclist 的库.
I have an odd bug in my program, it appears to me that malloc() is causing a SIGSEGV, which as far as my understanding goes does not make any sense. I am using a library called simclist for dynamic lists.
这是一个稍后引用的结构:
Here is a struct that is referenced later:
typedef struct { int msgid; int status; void* udata; list_t queue; } msg_t;这里是代码:
msg_t* msg = (msg_t*) malloc( sizeof( msg_t ) ); msg->msgid = msgid; msg->status = MSG_STAT_NEW; msg->udata = udata; list_init( &msg->queue );list_init是程序失败的地方,这里是list_init的代码:
list_init is where the program fails, here is the code for list_init:
/* list initialization */ int list_init(list_t *restrict l) { if (l == NULL) return -1; srandom((unsigned long)time(NULL)); l->numels = 0; /* head/tail sentinels and mid pointer */ l->head_sentinel = (struct list_entry_s *)malloc(sizeof(struct list_entry_s)); l->tail_sentinel = (struct list_entry_s *)malloc(sizeof(struct list_entry_s)); l->head_sentinel->next = l->tail_sentinel; l->tail_sentinel->prev = l->head_sentinel; l->head_sentinel->prev = l->tail_sentinel->next = l->mid = NULL; l->head_sentinel->data = l->tail_sentinel->data = NULL; /* iteration attributes */ l->iter_active = 0; l->iter_pos = 0; l->iter_curentry = NULL; /* free-list attributes */ l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS * sizeof(struct list_entry_s *)); l->spareelsnum = 0; #ifdef SIMCLIST_WITH_THREADS l->threadcount = 0; #endif list_attributes_setdefaults(l); assert(list_repOk(l)); assert(list_attrOk(l)); return 0; }行 l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS * 是根据堆栈跟踪导致 SIGSEGV 的位置.我正在使用 gdb/nemiver 进行调试,但我不知所措.第一次调用这个函数时它工作正常,但第二次总是失败.malloc() 怎么会导致 SIGSEGV?
the line l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS * is where the SIGSEGV is caused according to the stack trace. I am using gdb/nemiver for debugging but am at a loss. The first time this function is called it works fine but it always fails the second time. How can malloc() cause a SIGSEGV?
这是堆栈跟踪:
#0 ?? () at :0 #1 malloc () at :0 #2 list_init (l=0x104f290) at src/simclist.c:205 #3 msg_new (msg_switch=0x1050dc0, msgid=8, udata=0x0) at src/msg_switch.c:218 #4 exread (sockfd=8, conn_info=0x104e0e0) at src/zimr-proxy/main.c:504 #5 zfd_select (tv_sec=0) at src/zfildes.c:124 #6 main (argc=3, argv=0x7fffcabe44f8) at src/zimr-proxy/main.c:210非常感谢任何帮助或见解!
Any help or insight is very appreciated!
推荐答案malloc 可能会出现段错误,例如当堆损坏时.检查你写的东西没有超出任何先前分配的范围.
malloc can segfault for example when the heap is corrupted. Check that you are not writing anything beyond the bounds of any previous allocation.
更多推荐
malloc() 如何导致 SIGSEGV?
发布评论