查找损坏的共享库错误(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&, QString&, unsigned int, unsigned int, unsigned long long&, RunProcessWorker::ELaunchResultCodes&, QProcess::ProcessError&, int&) 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&, QStringList const&, QFlags<QIODevice::OpenModeFlag>) 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事件循环并在同一线程中执行,则无法正常工作。
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 可能的Qt5错误:调用setFixedSize()禁用主窗口的关闭按钮(在Win7下)
- Qt5 C++中出现意外"Multiple definition"错误
- C++ Qt5 QDir重命名返回错误
- 发生 Qt5.11 应用插件构建错误:信号和插槽参数不兼容
- QPushButton 错误在 QT5 下,同时推动在 macOS 上进入全屏
- 链接QT5库会自动将额外的FPIC标志传递给NVCC编译器,并通过cmake Cause错误
- Qt5:错误:“qt_metacall”不是 的成员
- 链接 Qt5.6 会产生找不到所需引用的错误
- QT5对QinputDialog和Qmessagebox的未识别引用.错误
- 在 qt5 中使用 QSharedPointer 时出现 Seg 错误
- VBA 中的 Qt5 Dll,错误运行时错误 453
- Qt5 - 尝试创建登录页面时"undefined reference"错误
- 使用QT5上的对象指针上使用QRegisterMetate类型会引发未解决的错误
- 将C++11程序链接到CMake中的Qt5会导致错误
- 查找损坏的共享库错误(QT5 C )的原因
- 为什么在使用QT5时收到以下错误
- Qt5:错误:'WA_LockPortraitOrientation'不是'Qt'的成员
- 错误:Qt5视频渲染错误代码80040218
- qt5错误发生Poppler::Document* Document