Memory gets smaller and smaller
Posted: Mon Sep 04, 2017 6:49 am
In my esp32, using esp-idf v2.1, there are socket with mbedtls and original sockets.
Those sockets will be close and resocket frequently.
a few time after the esp32 starts to run, I notice the memory gots smaller and smaller using
then I wrap thoes func with some log in my code, Trying to find the leak bug, hower every memory I got from [c-m-re]alloc, is freed.
Is there any other ways to debug the memory leak bug?
Besides I found a bug in mbedtls/port/net.c
Below is the original src of mbedtls_net_connect
hower if mbedtls_net_connect failed for connect, then ctx->fd is not -1, the subsequent call to mbedtls_net_free will result to some bad influence(may close sockets using by other thread).
Those sockets will be close and resocket frequently.
a few time after the esp32 starts to run, I notice the memory gots smaller and smaller using
Code: Select all
esp_get_free_heap_size
Code: Select all
mallc
Code: Select all
calloc
Code: Select all
realloc
Code: Select all
free
Is there any other ways to debug the memory leak bug?
Besides I found a bug in mbedtls/port/net.c
Code: Select all
mbedtls_net_connect
Code: Select all
mbedtls_net_bind
Code: Select all
/*
* Initiate a TCP connection with host:port and the given protocol
*/
int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto )
{
int ret;
struct addrinfo hints, *addr_list, *cur;
if ( ( ret = net_prepare() ) != 0 ) {
return ( ret );
}
/* Do name resolution with both IPv6 and IPv4 */
memset( &hints, 0, sizeof( hints ) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;
hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;
if ( getaddrinfo( host, port, &hints, &addr_list ) != 0 ) {
return ( MBEDTLS_ERR_NET_UNKNOWN_HOST );
}
/* Try the sockaddrs until a connection succeeds */
ret = MBEDTLS_ERR_NET_UNKNOWN_HOST;
for ( cur = addr_list; cur != NULL; cur = cur->ai_next ) {
ctx->fd = (int) socket( cur->ai_family, cur->ai_socktype,
cur->ai_protocol );
if ( ctx->fd < 0 ) {
ret = MBEDTLS_ERR_NET_SOCKET_FAILED;
continue;
}
if ( connect( ctx->fd, cur->ai_addr, cur->ai_addrlen ) == 0 ) {
ret = 0;
break;
}
close( ctx->fd );
ret = MBEDTLS_ERR_NET_CONNECT_FAILED;
}
freeaddrinfo( addr_list );
return ( ret );
}