2012-03-25 4 views
0

私のアプリケーションは、私がデバッグ対象外にリリースして実行するためにスイッチを切り替えると、私が壊れてしまいがちです。ここでは私のために動作し、ここではない何ものだセグメンテーションフォールトはリリース構成でのみ発生します

デバッグ構成と

  • デバッグ(QtのCreatorはIDEである) - OK
  • デバッグ構成で実行 - OK
  • リリース構成でのデバッグ - ok
  • リリース構成で実行 - appアプリケーションのクラッシュ

私のUIは1つのプロジェクトであり、いくつかのものの中核は独立した依存関係です。 Windows(MSVCCでコンパイル)では、私は最終的に関数を呼び出すメニューボタンを押しました。この関数では、新しい要素をベクトルに追加するときにアプリケーションが中断します。例えば:私はラインvector.push_back(y);をコメントアウトした場合はアプリが(すなわちOnMenuButtonClickの終わり)イベントスコープを離れるまで、アプリは何の問題を継続しない

str *x = new str(); 
str *y = new str(); 
/* ...set some of x & y's members... */ 
vector.push_back(x); // works fine 
vector.push_back(y); // causes crash 

std::vector<foo *> SomeFunction() 
{ 
    std::vector<foo *> returningVector; 
    /* do stuff */ 
    std::vector<foo *> goo = GetFooObjects(); 
    for (int i = 0; i < goo.size(); i++) 
    { 
     returningVector.push_back(goo[i]); // breaks here 
    } 
} 

だからこの奇妙な行動のいくつかの原因は、デバッグ構成の下に取り付けられていないデバッガなしで何をしている:私は除いOS X上では、ベクトルに要素を追加することの問題に似ていますか?私はすべての変数が初期化されていることを確認したので、私は困惑しています。上のコードを表示する場合は、最初の部分はhere、後の部分はhereとなります。あなたが「悪い」と思っていることを許してください。あなたがちょうど含むことができないという提案があるなら、GitHubで私にメッセージをしてください。

編集:

私はそれに多く見て、問題を引き起こしている正確に何が分かったが、それを修正する方法がわかりません。これは私のアプリがクラッシュする(OS X上の)関数である。

vector<Drive *> Drive::GetFATXDrives(bool HardDisks) 
{ 
    vector<Drive *> Return; 
    if (HardDisks) 
    { 
     vector<DISK_DRIVE_INFORMATION> Disks = GetPhysicalDisks(); 
     for (int i = 0; i < (int)Disks.size(); i++) 
     { 
      DISK_DRIVE_INFORMATION ddi = Disks.at(i); 
      // First, try reading the disk way 
      Streams::xDeviceStream* DS = NULL; 
      try 
      { 
       char path[0x200] = {0}; 
       wcstombs(path, ddi.Path, wcslen(ddi.Path)); 
       DS = new Streams::xDeviceStream(ddi.Path); 
      } 
      catch (xException& e) 
      { 
       continue; 
      } 

      if (DS == NULL || DS->Length() == 0 || DS->Length() < HddOffsets::Data) 
      { 
       // Disk is not of valid length 
       continue; 
      } 
      DS->SetPosition(HddOffsets::Data); 

      // Read the FATX partition magic 
      int Magic = DS->ReadInt32(); 
      // Close the stream 
      DS->Close(); 

      // Compare the magic we read to the *actual* FATX magic 
      if (Magic == FatxMagic) 
      { 
       Drive *d = new Drive(Disks.at(i).Path, Disks.at(i).FriendlyName, false); 
       Return.push_back(d); 
      } 
     } 
    } 

    vector<Drive *> LogicalDisks = GetLogicalPartitions(); 
    for (int i = 0; i < (int)LogicalDisks.size(); i++) 
    { 
     Return.push_back(LogicalDisks.at(i)); 
    } 

    return Return; 
} 

私はif (HardDisks = false)if (HardDisks)を変更すると、アプリが正常に動作します。だから、私はその範囲を調べて、vector<DISK_DRIVE_INFORMATION> Disks = GetPhysicalDisks();の後に、ヒープが壊れたり、そういうものがあることを発見しました。デバッガでは、その関数が呼び出された後、私のHardDisksブールが "false"に変更されていたので、これは気付きました。ここで

GetPhysicalDisksです:

vector<Drive::DISK_DRIVE_INFORMATION> Drive::GetPhysicalDisks(void) 
{ 
    // RIGHT AFTER this vector is initialized, everything goes to hell 
    vector<Drive::DISK_DRIVE_INFORMATION> ReturnVector; 

DIR *dir; 
dirent *ent; 
dir = opendir("/dev/"); 
if (dir != NULL) 
{ 
    // Read the shit 
    while ((ent = readdir(dir)) != NULL) 
    { 
     // Check the directory name, and if it starts with "disk" then keep it! 
     QRegExp exp("disk*"); 
     exp.setPatternSyntax(QRegExp::Wildcard); 
     exp.setCaseSensitivity(Qt::CaseInsensitive); 
     if (exp.exactMatch(ent->d_name)) 
     { 
      DISK_DRIVE_INFORMATION curdir; 
      memset(curdir.FriendlyName, 0, sizeof(curdir.FriendlyName)); 
      memset(curdir.Path, 0, sizeof(curdir.Path)); 

      char diskPath[0x50] = {0}; 
      sprintf(diskPath, "/dev/r%s", ent->d_name); 

      mbstowcs(curdir.Path, diskPath, strlen(diskPath)); 

      int device; 
      if ((device = open(diskPath, O_RDONLY)) > 0) 
      { 
#ifdef __linux 
       hd_driveid hd; 
       if (!ioctl(device, HDIO_GET_IDENTITY, &hd)) 
       { 
        swprintf(curdir.FriendlyName, strlen(hd) * 2, L"%hs", hd.model); 
       } 
#elif defined __APPLE__ 
       mbstowcs(curdir.FriendlyName, ent->d_name, strlen(ent->d_name)); 
#endif 
       ReturnVector.push_back(curdir); 
      } 
     } 
    } 
} 
    return ReturnVector; 
} 
+0

ベクターに複数のスレッドがアクセスしていますか? –

+0

@YochaiTimmerいいえ、そうではありません。 – Lander

+1

valgrindのmemcheckが無効な読み取り/書き込みのような問題を発見した場合、LinuxまたはOS Xで試してください。 –

答えて

0

これはを何が起こったのかについての本当の答えはありませんが、私は問題を解決する方法を見つけました。

vector<Drive *> Drive::GetFATXDrives(bool HardDisks) 
{ 
    // Initialize Disks vector up here 
    vector<DISK_DRIVE_INFORMATION> Disks; 
    // Call the function to get the hard disks 
    if (HardDisks) 
     Drive::GetPhysicalDisks(Disks); 

    vector<Drive *> ReturnVector; 
    if (HardDisks) 
    { 
     Streams::xDeviceStream* DS = NULL; 
     for (int i = 0; i < (int)Disks.size(); i++) 
     { 
      /* ... */ 
     } 
     if (DS) 
     { 
      DS->Close(); 
      delete DS; 
     } 
    } 

    vector<Drive *> LogicalDisks = GetLogicalPartitions(); 
    for (int i = 0; i < LogicalDisks.size(); i++) 
    { 
     ReturnVector.push_back(LogicalDisks[i]); 
    } 

    return ReturnVector; 
} 

をそして、私のDrive::GetPhysicalDisks機能は現在、1を返すのではなくvector<DISK_DRIVE_INFORMATION>リファレンスを取ります。上記の私の編集を見て、私はそうのように私のDrive::GetFATXDrives機能を編集しました。私のプログラムはそれだけでうまくいくと思った。

関連する問題