gpt4 book ai didi

c - 写入重新分配区域期间出现段错误

转载 作者:太空狗 更新时间:2023-10-29 17:26:26 24 4
gpt4 key购买 nike

我有一个非常令人沮丧的问题。我的应用程序在几台机器上完美运行了一个月。但是,由于段错误,我的应用程序几乎每天都在一台机器上崩溃。它总是在相同的指令地址崩溃:

segfault at 7fec33ef36a8 ip 000000000041c16d sp 00007fec50a55c80 error 6 in myapp[400000+f8000]

这个地址指向memcpy调用。

下面是我的应用程序的摘录 #1:

....
uint32_t size = messageSize - sizeof(uint64_t) + 1;

stack->trcData = (char*)Realloc(stack->trcData,(stack->trcSize + size + sizeof(uint32_t)));
char* buffer = stack->trcData + stack->trcSize;

uint32_t n_size = htonl(size);
memcpy(buffer,&n_size,sizeof(uint32_t)); /* ip 000000000041c16d points here*/
buffer += sizeof(uint32_t);

....
stack->trcSize += size + sizeof(uint32_t);
....

其中 stack 是一个结构:

struct Stack{
char* trcData;
uint32_t trcSize;
/* ... some other elements */
};

Realoc 是一个realloc 包装器:

#define Realloc(x,y)    _Realloc((x),(y),__LINE__)

void* _Realloc(void* ptr,size_t size,int line){

void *tmp = realloc(ptr,size);
if(tmp == NULL){
fprintf(stderr,"R%i: Out of memory: trying to allocate: %lu.\n",line,size);
exit(EXIT_FAILURE);
}
return tmp;
}

messageSizeuint32_t 类型,它的值总是大于 44 字节。代码 #1 循环运行。 stack->trcData 只是一个缓冲区,它收集一些数据直到满足某些条件。 stack->trcData 总是初始化为 NULL。该应用程序是使用 gcc 编译的,并启用了优化 -O3。当我在 gdb 中运行它时,它当然没有像我预期的那样崩溃;)

我想不出为什么 myapp 在 memcpy 调用期间崩溃。 Realloc 没有错误返回,所以我猜它分配了足够的空间,我可以写入这个区域。 Valgrind

valgrind --leak-check=full --track-origins=yes --show-reachable=yes myapp

绝对没有无效的读/写。

是否有可能在这台特定机器上内存本身已损坏并导致这些经常崩溃?或者我可能在 myapp 的其他地方损坏了内存,但如果是这种情况,为什么它不会在进行无效写入时更早崩溃?

在此先感谢您的帮助。

组装件:

41c164: 00 
41c165: 48 01 d0 add %rdx,%rax
41c168: 44 89 ea mov %r13d,%edx
41c16b: 0f ca bswap %edx
41c16d: 89 10 mov %edx,(%rax)
41c16f: 0f b6 94 24 47 10 00 movzbl 0x1047(%rsp),%edx
41c176: 00

我不确定此信息是否相关,但我的应用程序成功运行的所有机器都有英特尔处理器,而导致问题的机器有 AMD。

最佳答案

这是我的问题的原因。重点是在某个循环步骤 stack->trcSize + size 超过了 UINT32_MAX。这意味着 Realloc 实际上缩小了 stc->trcData。接下来,我定义了现在远远落后于分配区域的 buffer。因此,当我写入缓冲区时出现段错误。我检查了一下,确实是这个原因。

关于c - 写入重新分配区域期间出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18592115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com