私のアプリケーションは、私がデバッグ対象外にリリースして実行するためにスイッチを切り替えると、私が壊れてしまいがちです。ここでは私のために動作し、ここではない何ものだセグメンテーションフォールトはリリース構成でのみ発生します
デバッグ構成と
- デバッグ(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;
}
ベクターに複数のスレッドがアクセスしていますか? –
@YochaiTimmerいいえ、そうではありません。 – Lander
valgrindのmemcheckが無効な読み取り/書き込みのような問題を発見した場合、LinuxまたはOS Xで試してください。 –