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

问题描述:

我有一个相当简单的代码,其将启动一个QProcess中:查找损坏共享库错误(QT5 C++)的原因

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"; 

而且它是造成损坏的共享库错误。当我运行这段代码时,我从下面的gdb获得输出。我试图弄清楚错误中提到的任何内存位置,但是这里没有变量!有人能帮我理解这里出了什么问题吗?

(gdb) c 
Continuing. 
precorrupt 
Detaching after fork from child process 21667. 
P1 
warning: Corrupted shared library list: 0x7fffe8008970 != 0x7ffff691b000 
postcorrupt 
[New Thread 0x7fffed453700 (LWP 21668)] 

Breakpoint 1, RunProcessWorker::run (this=0x7fffffffcc30, whichMutex=RunProcessWorker::EMutexIP, activityID=..., commandFriendlyName=..., commandpath=..., 
    enableDebug=true, showDebugCommandLine=true, debugFilenameTemplate=..., myEnvironment=..., myParameters=..., myStdIn=..., myStdOut=..., myStdErr=..., 
    waitToStart=5000, waitToFinish=5000, [email protected]: 85, [email protected]: RunProcessWorker::ELaunchOk, 
    [email protected]: QProcess::UnknownError, [email protected]: 0) 
    at ../../src/external-sharedfiles/systemcommands/runprocessworker.cpp:292 
292   command->deleteLater(); 
(gdb) info symbol 0x7fffe8008970 
No symbol matches 0x7fffe8008970. 
(gdb) info symbol 0x7ffff691b000 
No symbol matches 0x7ffff691b000. 
(gdb) 

请注意,错误我P1输出之前时有发生,所以它的东西,在这方面,但我无法弄清楚什么!分叉的过程是一个Qt库,所以我无法看到该库(可能无法理解)......这是否意味着它是Qt库中的一个错误?

或许相关,但Valgrind的显示内存失去了对QProcess中启动功能:

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 
+0

添加更多的代码,尤其是在deletelater被称为 –

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

而且有趣的是你的调试器指定此作为坠毁的现场:

292   command->deleteLater(); 

正如你可能知道,deleteLater()可以使一个QObject稍后删除(即在一个Qt方法Qt事件循环的下一次迭代)。程序在这里崩溃的最可能原因是方法被调用的(command)指针是无效的(NULL或dangling)。在这种情况下,(命令)是否与您在发布的示例代码中调用的QProcess对象相同?如果是这样,是否有可能已经在某处删除了该QProcess对象,并使用悬挂指针将上面的崩溃代码留在上面? (如果你不知道,你可以继承QProcess中,把一个qDebug()语句在子类的析构函数,这样你可以在你的标准输出/ stderr输出使用QProcess对象被破坏只是何时何地看到...如果调试打印发生在崩溃之前,那么这是发生崩溃的原因)。如果您正在运行上面的代码“独立”,而不会在同一个线程中的QApplication(或QThread的)对象执行的exec()

另一个可能的问题是。由于deleteLater()将消息发布到Qt事件循环,如果没有Qt事件循环存在并且在同一个线程中执行,它将无法正常工作。

+0

的代码,我认为这是一个红鲱鱼:我定在292行,这就是为什么它停在那里一个断点。我也从删除deletelater(寻找线索)和错误保持不变。 – TSG

+0

如果您从不删除QProcess,该怎么办? (即就让它泄漏?) –

+0

我试图命令变量作为功能范围的变量,并且仍然没有差别 – TSG