Вызов _CrtDumpMemoryLeaks () в управляемом коде C # / WPF - PullRequest
1 голос
/ 01 июня 2011

Я пишу класс-оболочку для вызова _CrtDumpMemoryLeaks () в приложении WPF.Я загружаю DLL на языке C в приложение WPF и хотел бы узнать, есть ли утечки памяти в DLL, так как WPF также работает как тестовое приложение для DLL.

class MemLeak
{
    static int _CRTDBG_ALLOC_MEM_DF   =  0x01;
    static int _CRTDBG_LEAK_CHECK_DF  =  0x20;        
    static int _CRTDBG_MODE_DEBUG     =  0x2;
    static int _CRTDBG_MODE_WNDW      =  0x4;
    static int _CRT_WARN              =  0;
    static int _CRT_ERROR             =  1;
    static int _CRT_ASSERT            =  2;

    [DllImportAttribute("msvcrtd.dll", EntryPoint = "_CrtDumpMemoryLeaks", SetLastError = true)]
    static extern int _CrtDumpMemoryLeaks();

    [DllImportAttribute("msvcrtd.DLL", EntryPoint = "_CrtSetDbgFlag")]
    static extern int _CrtSetDbgFlag(int newFlag);

    [DllImportAttribute("msvcrtd.DLL", EntryPoint = "_CrtSetReportMode")]
    static extern int _CrtSetReportMode(int reportType, int reportMode);

    public static void StartMemLeakLogging()
    {
        _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
        _CrtSetReportMode(_CRT_ERROR | _CRT_WARN | _CRT_ASSERT, _CRTDBG_MODE_DEBUG);
    }

    public static void StopMemLeakLogging()
    {
        _CrtSetReportMode(_CRT_ERROR | _CRT_WARN | _CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW);
        int i = _CrtDumpMemoryLeaks();
    }
}

Я используюVisual Studio 2008 с пакетом обновления 1 (SP1) для Windows XP Professional с пакетом обновления 3 (SP3).Странно мне пришлось скачать файл msvcrtd.dll, потому что система не смогла его найти.После этого просто скопировал его в папку отладки и приложение начало работать.Однако я не вижу информации об утечке памяти в окне вывода во время отладки, даже если я намеренно выделил память и не освободил ее в коде DLL.

Кроме того, я не могу изменить исходный код DLL, иначепопытался бы поместить эти функции в исходный код DLL.Я пытался создать приложение MFC и вызывать функции DLL, приложение MFC обнаруживает утечки памяти и отображает в окне вывода, даже если я не вызываю _CrtDumpMemoryLeaks (), потому что я думаю, что MFC при отладке может вызывать эту функцию изнутри, но не работает сТестовое приложение WPF.

1 Ответ

0 голосов
/ 02 июня 2011

Получил это работает.Ссылка ниже для справки

http://social.msdn.microsoft.com/Forums/en/clr/thread/484de950-f488-452e-a9bf-b8b4cd2d1f75

...