4 Stimmen

Das Auffinden von Speicherlecks in einem boost::test::unit_test

Diese Frage ist eine Fortsetzung einer vorherigen Frage zu boost::test::unit_test.

Ich habe ein Unit-Test geschrieben und den Unit-Test erstellt. Hier ist die Build-Ausgabe:

    2>------ Build started: Project: UnitTests, Configuration: Debug Win32 ------
2>  stdafx.cpp
2>  UnitTests.cpp
2>  UnitTests.vcxproj -> F:\Src\Crash\trunk\Debug\UnitTests.exe
2>  
2>  3 Testfälle werden ausgeführt...
2>  Testgruppe "Master Testgruppe" bestanden mit:
2>    3 von 3 Behauptungen bestanden
2>    3 von 3 Testfällen bestanden
2>  
2>  Gefundene Speicherlecks!
2>  Objekte im Speicher ->
2>  {810} normaler Block bei 0x007C5610, 8 Bytes lang.
2>   Daten: 

Ich weiß aus Erfahrung, dass die Ausgabe, die das Speicherleck beschreibt, von der Verwendung der CRT-Speicherleckerkennung stammt.

Normalerweise könnten Sie zum Ermitteln der Zuordnungen im Quellcode folgendes am Anfang Ihres Einstiegspunkts hinzufügen:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetBreakAlloc( 809 );

Da jedoch boost::test::unit_test seinen eigenen Einstiegspunkt definiert, kann ich diese Zeilen nicht hinzufügen. Ich habe versucht, diese Zeilen zu einer Fixture hinzuzufügen, jedoch ohne Erfolg. Ich habe auch versucht, diese Zeilen im Testcode hinzuzufügen, wieder ohne Erfolg. Wenn ich diese Änderungen versuche, erhalte ich folgende Ausgabe:

1>------ Build started: Project: UnitTests, Configuration: Debug Win32 ------
1>  UnitTests.cpp
1>  UnitTests.vcxproj -> F:\Src\Crash\trunk\Debug\UnitTests.exe
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: Der Befehl ""F:\Src\Crash\trunk\Debug\\UnitTests.exe" --result_code=no --report_level=short
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: :VCEnd" wurde mit dem Code -2147483645 beendet.

Diese -ve Zahl entspricht 0x80000003 (ein oder mehrere Argumente sind ungültig).

Kann jemand vorschlagen, wie ich ermitteln könnte, wo in meinem Quellcode / Tests diese beiden Speicherlecks auftreten könnten?

Für die Neugierigen, hier ist mein Test:

void DShowUtilsGetFilter()
{
    // SysDevNames ist ein typedef für std::vector
    using namespace Crash::DirectShow;
    using namespace Crash::SystemDevices;
    using namespace std;

    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    _CrtSetBreakAlloc( 809 );

    HRESULT                 hr  = S_OK; 
    SysDevNames             AudioDevices;
    wstring                 wsAudioDevice;  
    CComPtr    spAudioFilter;

    try
    {
        TFAIL( ListDevicesInCategory( CLSID_AudioCompressorCategory, AudioDevices ) );

        if( AudioDevices.size() == 0 )
            throw E_FAIL;

        wsAudioDevice.assign(*AudioDevices.at(0));

        TFAIL( GetFilter( CLSID_AudioCompressorCategory, wsAudioDevice, &spAudioFilter ) );

        if( spAudioFilter.p )
            spAudioFilter.Release();

        BOOST_CHECK_EQUAL (hr, S_OK);

    }
    catch(...)
    {
        BOOST_CHECK_EQUAL( 1, 0 );              
    }

    if( AudioDevices.size() > 0)
    {
        for(SysDevNamesItr itr = AudioDevices.begin(); itr != AudioDevices.end(); itr ++ )
            delete *itr;

        AudioDevices.clear();
    }
}

2voto

Nick Punkte 23904

Schauen Sie hier: http://www.boost.org/doc/libs/1_40_0/libs/test/doc/html/execution-monitor/user-guide.html

Sie können wahrscheinlich ein Befehlszeilenargument setzen, um an der erforderlichen Zuweisungs-ID zu unterbrechen.

Bearbeiten: verwenden Sie --detect_memory_leak auf der Befehlszeile (von hier: http://www.boost.org/doc/libs/1_40_0/libs/test/doc/html/utf/user-guide/runtime-config/reference.html)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X