Здравствуйте, 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`а, даже нет данных какие сборки загружены