Re[2]: Нативная библиотека портит память
От: ajanov  
Дата: 03.04.24 07:44
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, ajanov, Вы писали:


A>>Как определить, в какой момент портится память?


Pzz>Интересно, а под valgrind-ом получится запустить .Net-овскую программу?

Пробую, для простоты написал простую библиотеку и программку на C#:

memtest1.cpp
#include "memtest1.h"

#include <iostream>
#include <stdlib.h>

extern "C"
{

    void * create(int n)
    {
        std::cout << "Create " << n << " bytes block" << std::endl;
        void * result = malloc(n);
        std::cout << "Block #" << result << std::endl;
        return result;
    }

    void destroy(void * ptr)
    {
        std::cout << "Destroy block" << std::endl;
        std::cout << "Block #" << ptr << std::endl;
        free(ptr);
        free(ptr);
    }

}


и FreeCheck.cs
using System.Runtime.InteropServices;

if (args.Length > 0)
{
    Thread.Sleep(1000);
    var ptr = FreeCheck.create(Int32.Parse(args[0]));
    FreeCheck.destroy(ptr);
}
Console.WriteLine("Hello, World!");

internal static class FreeCheck
{
    [DllImport("memtest1")]
    public static extern IntPtr create(int i);
    
    [DllImport("memtest1")]
    public static extern void destroy(IntPtr ptr);
}


Valgrind выдает:

Create 500 bytes block
Block #0x28ef3e80
Destroy block
Block #0x28ef3e80
==00:00:00:06.414 2290== Invalid free() / delete / delete[] / realloc()
==00:00:00:06.414 2290== at 0x4839A0F: free (vg_replace_malloc.c:985)
==00:00:00:06.414 2290== by 0x5C23F67B: ???
==00:00:00:06.414 2290== by 0x5C233509: ???
==00:00:00:06.414 2290== by 0x561E596: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x545478A: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x5329FE9: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x532A340: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x535ED22: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x5312209: coreclr_execute_assembly (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x52545B0: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libhostpolicy.so)
==00:00:00:06.414 2290== by 0x5254A40: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libhostpolicy.so)
==00:00:00:06.414 2290== by 0x525546B: corehost_main (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libhostpolicy.so)
==00:00:00:06.414 2290== by 0x51E6C13: ??? (in /usr/share/dotnet/host/fxr/6.0.25/libhostfxr.so)
==00:00:00:06.414 2290== by 0x51E5348: ??? (in /usr/share/dotnet/host/fxr/6.0.25/libhostfxr.so)
==00:00:00:06.414 2290== by 0x51E093A: hostfxr_main_startupinfo (in /usr/share/dotnet/host/fxr/6.0.25/libhostfxr.so)
==00:00:00:06.414 2290== by 0x117F7F: ??? (in /usr/share/dotnet/dotnet)
==00:00:00:06.414 2290== by 0x11826E: ??? (in /usr/share/dotnet/dotnet)
==00:00:00:06.414 2290== by 0x4C3409A: (below main) (libc-start.c:308)
==00:00:00:06.414 2290== Address 0x28ef3e80 is 0 bytes inside a block of size 500 free'd
==00:00:00:06.414 2290== at 0x4839A0F: free (vg_replace_malloc.c:985)
==00:00:00:06.414 2290== by 0x292123E3: destroy (in /home/zircon/1/FreeCheck/FreeCheck/bin/Debug/net6.0/libmemtest1.so.1.0.0)
==00:00:00:06.414 2290== by 0x5C23F67B: ???
==00:00:00:06.414 2290== by 0x5C233509: ???
==00:00:00:06.414 2290== by 0x561E596: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x545478A: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x5329FE9: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x532A340: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x535ED22: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x5312209: coreclr_execute_assembly (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x52545B0: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libhostpolicy.so)
==00:00:00:06.414 2290== by 0x5254A40: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libhostpolicy.so)
==00:00:00:06.414 2290== by 0x525546B: corehost_main (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libhostpolicy.so)
==00:00:00:06.414 2290== by 0x51E6C13: ??? (in /usr/share/dotnet/host/fxr/6.0.25/libhostfxr.so)
==00:00:00:06.414 2290== by 0x51E5348: ??? (in /usr/share/dotnet/host/fxr/6.0.25/libhostfxr.so)
==00:00:00:06.414 2290== by 0x51E093A: hostfxr_main_startupinfo (in /usr/share/dotnet/host/fxr/6.0.25/libhostfxr.so)
==00:00:00:06.414 2290== by 0x117F7F: ??? (in /usr/share/dotnet/dotnet)
==00:00:00:06.414 2290== by 0x11826E: ??? (in /usr/share/dotnet/dotnet)
==00:00:00:06.414 2290== by 0x4C3409A: (below main) (libc-start.c:308)
==00:00:00:06.414 2290== Block was alloc'd at
==00:00:00:06.414 2290== at 0x483676D: malloc (vg_replace_malloc.c:442)
==00:00:00:06.414 2290== by 0x29212269: create (in /home/zircon/1/FreeCheck/FreeCheck/bin/Debug/net6.0/libmemtest1.so.1.0.0)
==00:00:00:06.414 2290== by 0x5C23EA55: ???
==00:00:00:06.414 2290== by 0x5C2334F4: ???
==00:00:00:06.414 2290== by 0x561E596: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x545478A: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x5329FE9: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x532A340: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x535ED22: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x5312209: coreclr_execute_assembly (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libcoreclr.so)
==00:00:00:06.414 2290== by 0x52545B0: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libhostpolicy.so)
==00:00:00:06.414 2290== by 0x5254A40: ??? (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libhostpolicy.so)
==00:00:00:06.414 2290== by 0x525546B: corehost_main (in /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.25/libhostpolicy.so)
==00:00:00:06.414 2290== by 0x51E6C13: ??? (in /usr/share/dotnet/host/fxr/6.0.25/libhostfxr.so)
==00:00:00:06.414 2290== by 0x51E5348: ??? (in /usr/share/dotnet/host/fxr/6.0.25/libhostfxr.so)
==00:00:00:06.414 2290== by 0x51E093A: hostfxr_main_startupinfo (in /usr/share/dotnet/host/fxr/6.0.25/libhostfxr.so)
==00:00:00:06.414 2290== by 0x117F7F: ??? (in /usr/share/dotnet/dotnet)
==00:00:00:06.414 2290== by 0x11826E: ??? (in /usr/share/dotnet/dotnet)
==00:00:00:06.414 2290== by 0x4C3409A: (below main) (libc-start.c:308)
==00:00:00:06.414 2290==
Hello, World!
==00:00:00:07.891 2290==
==00:00:00:07.891 2290== HEAP SUMMARY:
==00:00:00:07.891 2290== in use at exit: 2,397,425 bytes in 2,742 blocks
==00:00:00:07.891 2290== total heap usage: 23,155 allocs, 20,414 frees, 10,033,514 bytes allocated
==00:00:00:07.891 2290==
==00:00:00:07.891 2290== For a detailed leak analysis, rerun with: --leak-check=full
==00:00:00:07.891 2290==
==00:00:00:07.891 2290== For lists of detected and suppressed errors, rerun with: -s
==00:00:00:07.891 2290== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)



Есть информация о стеке, но как понять, какие методы из кода на C# здесь вызываются? Пробовал запускать с параметрами --vgdb=yes, --vgdb-error=1 и подключаться gbd. Аналогично — gdb не видит отладочную информацию .NET`а, даже нет данных какие сборки загружены
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.