0

次のように文字列をベクターにプッシュすると、何が問題になりますか。

globalstructures->schema.columnnames.push_back("id");

コードにvalgrindを適用すると、表示されます

1 ブロックで 27 バイトが失われる可能性があり、19 の損失レコード 7 で失われる可能性があります。

そのように、非常に多くの場所で失われた可能性が示されています...これにより、割り当てと解放が一致しません....その結果、次のような奇妙なエラーが発生します

malloc.c:そのようなファイルまたはディレクトリはありません

コードのどこでもメモリの割り当てにcallocを使用していますが、次のような警告が表示されます

システムコール パラメータ write(buf) が初期化されていないバイトを指しています

そのエラーの原因となっているコードは

  datapage *dataPage=(datapage *)calloc(1,PAGE_SIZE);               
  writePage(dataPage,dataPageNumber); 
             
                     
  int writePage(void *buffer,long pagenumber)                 
  {
    int fd;
    fd=open(path,O_WRONLY, 0644);

     if (fd < 0)
        return -1;

    lseek(fd,pagenumber*PAGE_SIZE,SEEK_SET);

     if(write(fd,buffer,PAGE_SIZE)==-1)
    return false;


      close(fd);
      return true;
  }

gdbを実行しているときに発生する正確なエラーは...

ブレークポイント 1、getInfoFromSysColumns (tid=3、numColumns=@0x7ffffffffdf24: 1、typesVector=...、constraintVector=...、lengthsVector=...、columnNamesVector=...、offsetsVector=...) dbheader.cpp で:1080

プログラム受信信号 SIGSEGV、セグメンテーション違反。

_int_malloc (av=0x7ffff78bd720, bytes=8) at malloc.c:3498 3498 malloc.c: そのようなファイルまたはディレクトリはありません。

valgrindで同じことを実行すると、うまくいきます...

4

2 に答える 2

3

上手、

malloc.c:No such file or directory

gdbを使用してデバッグしているときに発生する可能性があり、mallocの近くで「n」の代わりにコマンド「s」を使用します。これは、基本的に、Linuxマシンでソースが利用できないmallocにステップインしようとしていることを意味します。

それはおそらく、valgrindで正常に機能しているのと同じ理由です。

于 2012-11-23T11:12:33.113 に答える
0

エラーがmallocにある理由:

問題は、一部のメモリ バッファを上書きし、メモリ マネージャが使用する構造の 1 つを破損したことです。(c)

--track-origins=yes を指定して valgrind を実行してみて、初期化されていないアクセスがどこから来るかを確認してください。初期化する必要があると信じていてそうでない場合、データが不正なポインターから来た可能性があります。valgrind は、値が作成された正確な場所を示します。おそらく、これらの初期化されていない値が、メモリ マネージャーの特殊バイトを含むバッファーを上書きしたのでしょう。

また、クラッシュの前にすべての valgrind 警告を確認してください。

于 2012-11-22T21:28:41.437 に答える