6

私は非常にイライラする問題を抱えています。私のアプリケーションは、数台のマシンで 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 */
};

そしてラッパーですReallocrealloc

#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 が搭載されています。

4

1 に答える 1

0

これが私の問題の原因です。ポイントは、いくつかのループ ステップでstack->trcSize + sizeUINT32_MAX を超えることです。つまりRealloc、実際には縮小しstc->trcDataます。buffer次に、割り当てられた領域よりもはるかに遅れているものを定義します。したがって、バッファに書き込むと、segfault が発生します。確認しましたが、確かにそれが原因でした。

于 2013-09-12T11:52:23.807 に答える