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

Finding cause of corrupted shared library error (Qt5 C++)

本文关键字:QT5 错误 损坏 共享 查找      更新时间:2023-10-16

我有一个相当简单的代码,该代码启动了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";

这会导致损坏的共享库错误。当我运行此代码时,我会从下面的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, actualRunTime=@0x7fffffffca58: 85, launchResultCode=@0x7fffffffca54: RunProcessWorker::ELaunchOk, 
    qprocessErrorCode=@0x7fffffffca50: QProcess::UnknownError, qprocessesExitCode=@0x7fffffffca6c: 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

请注意,您的错误消息不会说"损坏的共享库",而是"损坏的共享库 list "。也就是说,您过程的内存空间中共享库的列表是损坏的,而不是共享库本身。因此,我的怀疑不是您有一个损坏的共享库,而是某些东西在您程序的内存空间中覆盖内存,并导致损坏该列表的损坏。

还有趣的是,您的调试器将其指定为崩溃的网站:

292         command->deleteLater();

您可能知道,DeleteLater()是一种QT方法,用于稍后删除QObject(即,在QT事件循环的下一次迭代中)。该程序会崩溃的最可能的原因是,该方法被调用的(命令)指针无效(无效或悬空)。在这种情况下,(命令)与您在发布的示例代码中所调用的对象相同吗?如果是这样,您是否有可能已经在某处删除了该Qprocess对象,而将上面的崩溃代码带有一个悬空的指针?(如果不确定,您可以在子类的驱动器中进行QPROCESS,然后将QDebug()语句放在您的stdout/stderr输出中,以及QPROCESS对象被销毁...调试印刷发生在坠机发生之前,这是一个很好的线索。

另一个可能的问题是,如果您在同一线程中执行exec()的qapplication(或qthread)对象执行exec(),则在上述代码"独立"中。由于DeleteLater()将消息发布到QT事件循环中,因此如果没有QT事件循环并在同一线程中执行,则无法正常工作。