0

編集:作業ディレクトリを変更すると機能するため、ファイルは別のディレクトリに作成されます。以前使用していたディレクトリで唯一奇妙な点は、それが VirtualBox で使用される共有ディレクトリであることです。これはずっと VirtualBox のバグですか? 別のディレクトリの使用を開始することをお勧めします。

私は非常に奇妙な問題を抱えています。私のプログラムのどこかにこのコードがあります。問題を示すためにいくつかの情報を出力するように変更しました。

uint8_t section[9];
long pos = ftell(rd);
fseek(rd, 0, SEEK_END);
printf("%li\n",ftell(rd));
fseek(rd, pos, SEEK_SET);
printf("%li\n",ftell(rd));
clearerr(rd);
int i = fread(section, 1, 9, rd);
if (i != 9){
    printf("%i - %i - %i\n",i,feof(rd),ferror(rd));

出力は次のとおりです。

23
14
0 - 0 - 1

したがって、この時点でのファイルの長さは 23 で、カーソルは 14 です。9 バイトが必要ですが、fread はゼロを返し、エラーを表示します。この問題は、OSX ではなく Linux Mint で発生します。他の誰かが debian でこの問題を抱えていないようです。何がこの問題を引き起こすのかわかりません。エラーの原因をさらに診断する方法はありませんか? ferror() はゼロ情報を提供します。

ファイルは「wb+」モードで開かれます。

編集:

valgrind で次のあいまいなエラーが見つかりました。

==22141== Syscall param write(buf) points to uninitialised byte(s)
==22141==    at 0x5B68900: __write_nocancel (syscall-template.S:82)
==22141==    by 0x5AFB882: _IO_file_write@@GLIBC_2.2.5 (fileops.c:1289)
==22141==    by 0x5AFB749: new_do_write (fileops.c:543)
==22141==    by 0x5AFCEB4: _IO_do_write@@GLIBC_2.2.5 (fileops.c:516)
==22141==    by 0x5AFDD3E: _IO_switch_to_get_mode (genops.c:189)
==22141==    by 0x5AFBA96: _IO_file_seekoff@@GLIBC_2.2.5 (fileops.c:999)
==22141==    by 0x5AF4F25: rewind (rewind.c:37)
==22141==    by 0x567D149: CBFileAppend (CBFileEC.c:69)
==22141==    by 0x5473AFA: CBDatabaseCreateDeletionIndex (CBDatabase.c:270)
==22141==    by 0x5473195: CBInitDatabase (CBDatabase.c:112)
==22141==    by 0x54721A1: CBNewAddressStorage (CBAddressStorage.c:37)
==22141==    by 0x401F67: main (testCBAddressManager.c:226)
==22141==  Address 0x402a009 is not stack'd, malloc'd or (recently) free'd
==22141==  Uninitialised value was created by a stack allocation
==22141==    at 0x546F750: ??? (in /media/sf_BitEagle_Projects/cbitcoin/bin/libcbitcoin-storage.2.0.so)

どこかわからない???は明らかに、これをさらにデバッグすることはできません。rewind() で不平を言っているのは奇妙です。

ありがとう。

4

2 に答える 2

2

ドキュメントによると、「wb+」は既存のファイルの内容を破棄します: http://en.cppreference.com/w/c/io/fopen。「rb+」を使用しようとするときは、最初にファイルを再作成する必要があります。そうしないと、その呼び出しで「wb+」を使用してファイルを開いた場合と同じ問題が発生するように見えます。

編集:これはあなたの完全なサンプルコードのようですか?

int main()
{
  typedef unsigned char uint8_t;

  FILE * rd = fopen("foo.tmp", "wb+");
  uint8_t section[9] = {0};
  long pos = 0;

  fprintf(rd, "01234567890123456789012");

  fseek(rd, 14, SEEK_SET);
  pos = ftell(rd);
  fseek(rd, 0, SEEK_END);
  printf("%li\n",ftell(rd));
  fseek(rd, pos, SEEK_SET);
  printf("%li\n",ftell(rd));
  clearerr(rd);
  int i = fread(section, 1, 9, rd);
  if (i != 9){
    printf("%i - %i - %i\n",i,feof(rd),ferror(rd));
  }

  return 0;
}
于 2013-02-03T19:03:42.807 に答える
0

あなたはおそらくこれを信じないでしょうが、それは確かにVirtualBoxと共有ディレクトリの問題でした。ビルドプロセスは通常のディレクトリで正常に機能します。助けてくれたみんなに感謝します。私はこれまでstraceを使用したことがありませんが、それを覚えておきます!そして、私は最終的にstrace-plusを動作させることができました。これは、いつか役立つかもしれません。

于 2013-02-03T22:43:15.453 に答える