繁体   English   中英

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

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

我有一段相当简单的代码可以启动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

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

同样有趣的是,调试器将其指定为崩溃的站点:

292         command->deleteLater();

如您所知,deleteLater()是一种Qt方法,用于导致稍后删除QObject(即,在Qt事件循环的下一次迭代中)。 程序在此处崩溃的最可能原因是,正在调用该方法的(命令)指针无效(NULL或悬空)。 在这种情况下,(命令)与您在发布的示例代码中调用的QProcess对象是否相同? 如果是这样,是否有可能已经在某个地方删除了QProcess对象,使上面崩溃的代码悬空了呢? (如果不确定,可以对QProcess进行子类化,然后在子类的析构函数中放入qDebug()语句,以便可以在stdout / stderr输出中看到销毁QProcess对象的位置和时间……以及是否debug-print在崩溃之前发生,那么这是崩溃发生原因的一个很好的线索)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM