C++ 查找损坏的共享库错误的原因(Qt5 C+;+;)

C++ 查找损坏的共享库错误的原因(Qt5 C+;+;),c++,qt,memory,corruption,C++,Qt,Memory,Corruption,我有一段相当简单的代码启动QProcess: launchResultCode = ELaunchOk; QDateTime beginTimeStamp = QDateTime::currentDateTime(); command->start(commandpath, myParameters); if (command->waitForStarted(waitToStart)) { if (!myStdIn.isEmpty()) command->write(m

我有一段相当简单的代码启动QProcess:

launchResultCode = ELaunchOk;
QDateTime beginTimeStamp = QDateTime::currentDateTime();
command->start(commandpath, myParameters);
if (command->waitForStarted(waitToStart)) {
    if (!myStdIn.isEmpty()) command->write(myStdIn.toLatin1());
    command->closeWriteChannel();
    qDebug() << "P1";
    if (command->waitForFinished(waitToFinish)) {
        myStdOut = command->readAllStandardOutput();
        myStdErr = command->readAllStandardError();
    } else {
        launchResultCode = ELaunchFinishFailed;
    }
} else {
    launchResultCode = ELaunchStartFailed;
}
qDebug() << "postcorrupt";
请注意,错误有时发生在我的P1输出之前,所以这是该区域中的某个部分,但我不知道是什么!分叉的进程是一个Qt库,因此我无法查看该库(可能无法理解它)…这是否意味着它是Qt库中的一个bug

可能相关,但valgrind显示QProcess start函数的内存丢失:

30 (24 direct, 6 indirect) bytes in 1 blocks are definitely lost in loss record 837 of 2,936
  in RunProcessWorker::run(RunProcessWorker::EMutex, QString, QString, QString, bool, bool, QString, QStringList, QStringList, QString, QString&amp;, QString&amp;, unsigned int, unsigned int, unsigned long long&amp;, RunProcessWorker::ELaunchResultCodes&amp;, QProcess::ProcessError&amp;, int&amp;) in /mnt/lserver2/data/development/sharedfiles/systemcommands/runprocessworker.cpp:241
  1: operator new[](unsigned long) in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so
  2: /opt/Qt/5.3/gcc_64/lib/libQt5Core.so.5.3.1
  3: /opt/Qt/5.3/gcc_64/lib/libQt5Core.so.5.3.1
  4: QProcess::start(QString const&amp;, QStringList const&amp;, QFlags&lt;QIODevice::OpenModeFlag&gt;) in /opt/Qt/5.3/gcc_64/lib/libQt5Core.so.5.3.1

请注意,您的错误消息不是说“损坏的共享库”,而是说“损坏的共享库列表”。也就是说,进程内存空间中的共享库列表是损坏的,而不是共享库本身。所以我的怀疑不是你有一个损坏的共享库,而是有什么东西正在覆盖程序内存空间中的内存,并导致损坏列表

另外,有趣的是,调试器将此指定为崩溃的站点:

292         command->deleteLater();
您可能知道,deleteLater()是一种Qt方法,用于在以后(即在Qt事件循环的下一次迭代中)删除QObject。程序在此崩溃的最可能原因是调用该方法的(命令)指针无效(NULL或挂起)。在本例中,(command)是否与您在发布的示例代码中调用的QProcess对象相同?如果是这样的话,是否可能您已经在某个地方删除了QProcess对象,留下了上面的崩溃代码和一个悬空的指针?(如果您不确定,可以将QProcess子类化,并在子类的析构函数中放入qDebug()语句,这样您就可以在stdout/stderr输出中看到QProcess对象被销毁的位置和时间……如果调试打印发生在崩溃之前,那么这就是崩溃发生原因的好线索)


另一个可能的问题是,如果您在“独立”运行上述代码,而没有QApplication(或QThread)对象在同一线程中执行exec()。由于deleteLater()将消息发布到Qt事件循环,因此如果同一线程中不存在并执行Qt事件循环,它将无法正常工作。

我认为这是一个误会:我在第292行设置了一个断点,这就是它在那里停止的原因。我也从delete切换到deletelater(寻找线索),bug保持不变。如果你根本不删除QProcess呢?(即,让它泄漏?)我尝试将命令变量作为函数范围的变量,但仍然没有区别我尝试不删除qprocess(正如jeremy所建议的),错误仍然发生得比较晚,但是。。。你解决了这个问题吗?我遇到了同样的问题,我开始认为这是一个与GDB和调试符号有关的问题,而不是代码本身
292         command->deleteLater();