私は非常にイライラする問題を抱えています。私のアプリケーションは、数台のマシンで 1 か月問題なく動作します。ただし、segfault が原因でほぼ毎日アプリケーションがクラッシュするマシンが 1 台あります。常に同じ命令アドレスでクラッシュします。
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 */
};
そしてラッパーですRealloc
: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;
}
messageSize
型でありuint32_t
、その値は常に 44 バイトを超えています。コード #1 はループで実行されます。stack->trcData
ある条件が満たされるまで、いくつかのデータを収集する単なるバッファです。stack->trcData
は常に に初期化されNULL
ます。gcc
アプリケーションは、最適化を-O3
有効にしてコンパイルされます。で実行するとgdb
、もちろん、予想どおりクラッシュしませんでした;)
memcpy
通話中に myapp がクラッシュする理由がわかりません。Realloc
エラーなしで返されるので、十分なスペースが割り当てられていると思います。この領域に書き込むことができます。ヴァルグラインド
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
この情報が関連しているかどうかはわかりませんが、私のアプリケーションが正常に実行されているすべてのマシンには Intel プロセッサが搭載されていますが、問題を引き起こしているマシンには AMD が搭載されています。