Поиск причины ошибки поврежденной общей библиотеки (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

person TSG    schedule 08.05.2015    source источник
comment
Добавьте больше кода, особенно код, где вызывается deletelater   -  person Frank Osterfeld    schedule 10.05.2015


Ответы (1)


Обратите внимание, что в вашем сообщении об ошибке не говорится "повреждена общая библиотека", а скорее "поврежден список общей библиотеки". То есть поврежден список разделяемых библиотек в пространстве памяти вашего процесса, а не сами общие библиотеки. Таким образом, я подозреваю не то, что у вас повреждена общая библиотека, а то, что что-то перезаписывает память в пространстве памяти вашей программы и вызывает повреждение, которое приводит к повреждению этого списка.

Также интересно, что ваш отладчик указывает это как место сбоя:

292         command->deleteLater();

Как вы, возможно, знаете, deleteLater() — это метод Qt, вызывающий удаление QObject позже (т. е. на следующей итерации цикла обработки событий Qt). Наиболее вероятная причина сбоя программы здесь заключается в том, что указатель (команды), для которого вызывается метод, недействителен (либо NULL, либо оборванный). Является ли (команда) в этом случае тем же объектом QProcess, что и тот, который вы вызываете в своем опубликованном примере кода? Если да, то возможно ли, что вы где-то уже удалили этот объект QProcess, оставив приведенный выше код сбоя с оборванным указателем? (Если вы не уверены, вы можете создать подкласс QProcess и поместить оператор qDebug() в деструктор вашего подкласса, чтобы вы могли видеть в своем выводе stdout/stderr, где и когда объект QProcess был уничтожен... и если это debug-print происходит до сбоя, тогда это хороший ключ к тому, почему произошел сбой).

Другая возможная проблема может возникнуть, если вы запускаете приведенный выше код «автономно», без объекта QApplication (или QThread), выполняющего exec() в том же потоке. Так как deleteLater() отправляет сообщение в цикл событий Qt, он не будет работать должным образом, если цикл событий Qt не присутствует и не выполняется в том же потоке.

person Jeremy Friesner    schedule 08.05.2015
comment
Я думаю, что это отвлекающий маневр: я установил точку останова на строке 292, поэтому она там и остановилась. Я также переключился с удаления на удаление позже (в поисках подсказок), и ошибка осталась прежней. - person TSG; 08.05.2015
comment
Что, если вы вообще никогда не удаляете QProcess? (то есть просто дать ей вытечь?) - person Jeremy Friesner; 08.05.2015
comment
Я пробовал командную переменную как переменную с функциональной областью, и до сих пор нет разницы - person TSG; 08.05.2015
comment
Я пытался НЕ удалять qprocess (как предложил Джереми), и ошибка все еще возникает - person TSG; 15.10.2015
comment
Здесь немного поздно, но ... вам удалось это решить? Я сталкиваюсь с той же проблемой, и я начинаю думать, что это проблема, связанная с GDB и символами отладки, а не с самим кодом. - person José Tomás Tocino; 10.04.2018