Я не уверен, как это сделать в работающей программе, но, возможно, LD_PRELOAD
будет работать для вас. Если вы установите для этой переменной среды список общих объектов, загрузчик времени выполнения загрузит общий объект в начале процесса и позволит его функциям иметь приоритет над другими.
LD_PRELOAD=path_to_library/asdf.so path/to/prog
Вы должны сделать это, прежде чем начать процесс, но вам не нужно перестраивать программу.
Очистка должна выполняться деструкторами и отношениями дочерний и родительский.
Сделайте ваш главный объект (тот, который находится в основном) дочерним по отношению к QApplication, чтобы он был уничтожен со всеми его дочерними элементами до QApplication является.
Вы уверены, что убили все свои нити? Если это поток с циклом событий, обязательно вызовите QThread :: quit ()
для выхода из цикла событий перед вызовом QThread :: wait ()
Вы также можете использовать void QApplication :: qAddPostRoutine (QtCleanUpFunction ptr)
для специальной очистки.
Для отладки этих сообщений вы можете использовать QtMsgHandler qInstallMsgHandler (QtMsgHandler h)
и написать свой собственный обработчик сообщений для захвата этих предупреждений. Если вы можете смоделировать проблему, вы можете установить точку останова на сообщении и посмотреть в стеке, откуда приходит сообщение.
void debugMessageHandler( QtMsgType type, const char *msg ){
if(QString(msg).contains( "The message you can see in the console" )){
int breakPointOnThisLine(0);
}
switch ( type ) {
case QtDebugMsg:
fprintf( stderr, "Debug: %s\n", msg );
break;
case QtWarningMsg:
fprintf( stderr, "Warning: %s\n", msg );
break;
case QtFatalMsg:
fprintf( stderr, "Fatal: %s\n", msg );
abort();
}
}
Чтобы выполнить очистку с помощью деструктора и отношения дочернего к родительскому, вы можете поймать сигнал закрытия консоли и вызвать QCoreApplication :: exit ()
для экземпляра приложения.
#include <csignal>
#include <QtCore/QCoreApplication>
using namespace std;
struct CleanExit{
CleanExit() {
signal(SIGINT, &CleanExit::exitQt);
signal(SIGTERM, &CleanExit::exitQt);
signal(SIGBREAK, &CleanExit::exitQt) ;
}
static void exitQt(int sig) {
QCoreApplication::exit(0);
}
};
int main(int argc, char *argv[])
{
CleanExit cleanExit;
QCoreApplication a(argc, argv);
return a.exec();
}
вы можете подключиться к сигналу QCoreApplication :: aboutToQuit и выполнить необходимую очистку там наверху.