¿Cómo puedo detectar fugas de memoria en QtCreator en Windows? En el doc, se recomienda Memcheck pero sólo funciona en Mac y Linux. Cualquier sugerencia para Windows?

OriginalEl autor this.lau_ | 2011-07-26

3 Comentarios

  1. 22

    Después de muchos intentos por fin he encontrado un método para detectar las pérdidas de memoria de un Qt proyecto en Windows:

    1) en Primer lugar, no se puede hacer directamente en Qt Creator por lo que necesita para crear un proyecto de Visual C++ para hacer la detección de pérdida de memoria. Afortunadamente, qmake hace que sea fácil. Abra el Qt SDK herramienta de línea de comandos y ejecutar:

    qmake -spec win32-msvc2008 -tp vc

    Este va a convertir su proyecto en una .vcproj.

    2) Abra este proyecto y agregar el código necesario para la detección de fugas de memoria:

    A su main.cpp de archivo:

    //Necessary includes and defines for memory leak detection:
    #ifdef _MSC_VER
    #define _CRTDBG_MAP_ALLOC
    #include <crtdbg.h>
    #endif //_MSC_VER
    #if defined(_MSC_VER)
    //Code to display the memory leak report
    //We use a custom report hook to filter out Qt's own memory leaks
    //Credit to Andreas Schmidts - http://www.schmidt-web-berlin.de/winfig/blog/?p=154
    _CRT_REPORT_HOOK prevHook;
    int customReportHook(int /* reportType */, char* message, int* /* returnValue */) {
    //This function is called several times for each memory leak.
    //Each time a part of the error message is supplied.
    //This holds number of subsequent detail messages after
    //a leak was reported
    const int numFollowupDebugMsgParts = 2;
    static bool ignoreMessage = false;
    static int debugMsgPartsCount = 0;
    //check if the memory leak reporting starts
    if ((strncmp(message,"Detected memory leaks!\n", 10) == 0)
    || ignoreMessage)
    {
    //check if the memory leak reporting ends
    if (strncmp(message,"Object dump complete.\n", 10) == 0)
    {
    _CrtSetReportHook(prevHook);
    ignoreMessage = false;
    } else
    ignoreMessage = true;
    //something from our own code?
    if(strstr(message, ".cpp") == NULL)
    {
    if(debugMsgPartsCount++ < numFollowupDebugMsgParts)
    //give it back to _CrtDbgReport() to be printed to the console
    return FALSE;
    else
    return TRUE;  //ignore it
    } else
    {
    debugMsgPartsCount = 0;
    //give it back to _CrtDbgReport() to be printed to the console
    return FALSE;
    }
    } else
    //give it back to _CrtDbgReport() to be printed to the console
    return FALSE;
    }
    #endif
    int main(int argc, char *argv[]) {
    #if defined(_MSC_VER)
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    prevHook = _CrtSetReportHook(customReportHook);
    //_CrtSetBreakAlloc(157); //Use this line to break at the nth memory allocation
    #endif
    QApplication* app = new QApplication(argc, argv);   
    int appError = app->exec();
    delete app;
    #if defined(_MSC_VER)
    //Once the app has finished running and has been deleted,
    //we run this command to view the memory leaks:
    _CrtDumpMemoryLeaks();
    #endif 
    return appError;
    }

    3) Con esto, el proyecto ahora debe ser capaz de detectar fugas de memoria. Nota el _MSC_VER define de forma que este código sólo se ejecuta cuando su ejecución de Visual C++ (no de Qt Creator). Esto significa que usted todavía puede hacer el desarrollo con Qt Creator y acabo de volver a ejecutar el paso 1 cuando usted necesita para comprobar las fugas de memoria.

    4) Para romper en una determinada asignación de memoria, el uso de _CrtSetBreakAlloc() Más información de detección de pérdida de memoria en el sitio web de Microsoft: http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.80%29.aspx

    OriginalEl autor this.lau_

  2. 8

    Nueva 2017 solución

    cita @this.lau_

    Primero, no se puede hacer directamente en Qt Creator por lo que necesita para crear
    un proyecto de Visual C++ para hacer la detección de pérdida de memoria. Afortunadamente,
    qmake hace esto fácil.

    1) Abrir el Qt SDK herramienta de línea de comandos y ejecutar:

    qmake -spec win32-msvc2015 -tp vc

    2) Instalar Visual Detector de Fugas para Visual C++

    3) Abrir una .vcxproj que fue creado con el paso 1

    4) Incluir en su main.cpp

    #include <vld.h>

    5) Lanzamiento DebugView v4.81

    6) De ejecutar el proyecto ctrl + F5

    Ambas respuestas son excelentes, sólo quería añadir que en posteriores versiones de QT sustituto de la línea de comandos qmake -spec win32-msvc2015 -tp vc con qmake -tp vc parece funcionar. El -spec argumento ha cambiado.

    OriginalEl autor Mikhail

  3. 1

    Aquí la más reciente respuesta. Qt Creator 4.7.1 ahora soporta heob, que es un detector de fugas. Se puede bajar para Windows desde aquí: «heob descargar | SourceForge.net». Extracto de ella en algún lugar, obtener la más reciente versión de Qt Creator, y vaya a Analizar | heob. Directo a yer .exe, elegir tus opciones, haga clic en el pequeño icono del disco para guardar tu apuesta y haga clic en ACEPTAR para ejecutar yer progresivo. Da u un poco agradable memcheck ventana que parece darle volcados de pila en el momento en que los objetos fueron asignados, de los cuales u puede desplegar y ver la de ofender a los objetos; cuando se utiliza el detector de Fuga de los Tipos de opción. Usted puede incluso navegar a la línea de la fuente de donde la nueva ocurrido haciendo clic en el enlace.

    OriginalEl autor CodeLurker

Dejar respuesta

Please enter your comment!
Please enter your name here